java - BroadcastReceiver 中的 Volley 请求不起作用
问题描述
好的,我有以下类,它应该在设备打开时执行。因此,为了尝试它,我在我的模拟设备上进行了冷启动。原来这个请求似乎永远不会被调用。这怎么可能?
public class AlarmNotificationReceiver extends BroadcastReceiver{
private RequestQueue mQueue;
@Override
public void onReceive(Context context, Intent intent) {
mQueue = Volley.newRequestQueue(context);
while(true){
if(Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())){
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, API.getDeviceTypes(), null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
Log.d("mytag","TEST"); //THIS IS NEVER BEING PRINTED!
processResponse(response);
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("mytag", "Error de response");
error.printStackTrace();
}
});
mQueue.add(request);
Log.d("mytag","OK IM HERE EVERYONE"); // THIS WORKS
}
try {
Thread.sleep(60000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
解决方案
我使用 if(true) 在广播接收器上测试和调试您的代码(以防万一我能看到发生了什么?)我发现没有 while 语句可以正常工作。我认为您的问题出在您的代码上,而不是在广播接收器中使用凌空。不要忘记将此行添加到清单中:
<receiver android:name="com.app.test.AlarmNotificationReceiver">
<intent-filter>
<action android:name="com.example.alarm.notifier" />//this should be unique string as action
</intent-filter>
</receiver>
和权限:使用权限 android:name="android.permission.INTERNET"
运行此代码并查看 Logcat,这很好!(您可以在 10 秒后在 LogCat 上看到响应,并在 1 分钟后在您的代码上看到响应)
public class AlarmNotificationReceiver extends BroadcastReceiver {
private RequestQueue mQueue;
@Override
public void onReceive(final Context context, Intent intent) {
Log.d("onrecieve", "on recieveeeeeeeeee");
mQueue = Volley.newRequestQueue(context);
if (true) {
String url = " http://www.mocky.io/v2/5b2734202e000010009e42c3";
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
Log.d("mytag", response.toString()); //THIS IS NEVER BEING PRINTED!
String name = response.getString("name");
Toast.makeText(context, name + "", Toast.LENGTH_SHORT).show();
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("mytag", "Error de response");
error.printStackTrace();
}
});
mQueue.add(request);
Log.d("mytag", "OK IM HERE EVERYONE"); // THIS WORKS
}
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
推荐阅读
- angular - switchMap angular observable 后发出的问题
- android - 从 android studio 编码并在 python raspberry pi 中解码的图片
- c - 使用 C 验证文件中的登录凭据
- javascript - 如何判断 Javascript 对象是否是文件?
- python - tf.image.convert_image_dtype 的错误?值不缩放
- angular - 当用户访问 Ionic 4 中的特定路线时重定向用户
- android-studio - 如何在 android studio 3.3 中查找所有预览屏幕尺寸
- mysql - 从 python mysql 连接器连接到 Amazon RDS mysql 时出现 SSL 连接错误
- reactjs - 不确定是什么在我的 ReactJS 项目中产生了这个输入错误
- java - Telegram-bot Java 中的 ScheduledThreadPoolExecutor