首页 > 解决方案 > 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();
            }
        }

    }

标签: javaandroidandroid-volleyandroid-broadcastreceiver

解决方案


我使用 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();
    }


}

}


推荐阅读