Проблема при обращении к серверу из BroadcastReceiver для получения данных JSON с использованием Volley - PullRequest
0 голосов
/ 07 января 2019

У меня есть два приложения, которые прекрасно работают, но я не могу собрать их вместе. Одно приложение загружает список цитат известных людей (в формате JSON) с сервера, используя Volley. Затем пользователь может видеть и контролировать кавычки на экране, как запрограммировано в MainActivity. Я хотел улучшить свое приложение, предоставляя пользователю возможность получать ежедневные уведомления. Я только что закончил замечательное Основы Android по уведомлениям и тревогам от Google, где мне показывали, строка за строкой, как это сделать. Все работает отлично, за исключением получения данных с сервера. Volley не работает из метода onReceive в BroadcastReceiver. Приложение просто не идет по ссылке. setLoadingQue(Volley.newRequestQueue(context));//this isn't working. Я думаю, что может быть что-то не так с контекстом. Можно ли решить эту проблему с помощью Volley? Пожалуйста, помогите.

public class AlarmReceiver extends BroadcastReceiver {

private NotificationManager mNotificationManager;
// Notification ID.
private static final int NOTIFICATION_ID = 0;
// Notification channel ID.
private static final String PRIMARY_CHANNEL_ID =
        "primary_notification_channel";

private ArrayList<Proverb> theListOfAll;
private Proverb theFirstQuote;
private String theNotification;
private short dID;
private String dProverb;
private String dSource;

private Proverb getRandom() {
    Proverb result;
    int i = (int) Math.floor(Math.random() * theListOfAll.size());
    result = theListOfAll.get(i);
    return result;
}


@Override
public void onReceive(Context context, Intent intent) {

    theListOfAll = new ArrayList<>();
    theListOfAll.add(new Proverb((short) 0, "The secret of getting ahead is getting started.", "Mark Twain"));
    theFirstQuote = theListOfAll.get(0);
    theNotification = theFirstQuote.getProverb() + " " + theFirstQuote.getTheSource();//this works

    mNotificationManager = (NotificationManager)
            context.getSystemService(Context.NOTIFICATION_SERVICE);

    //get the quote
    setLoadingQue(Volley.newRequestQueue(context));//this isn't working
    // Deliver the notification.
    deliverNotification(context);//this works, sends the notification formed a few lines above
}


private RequestQueue loadingQue;

/**
 * Adapted from StackOverflow
 */
public void setLoadingQue(RequestQueue loadingQue) {
    this.loadingQue = loadingQue;
    JsonArrayRequest arrReq = new JsonArrayRequest(Request.Method.GET, "http://myjson.com/r5mps",
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    // Check the length of our response (to see if the user has any repos)
                    if (response.length() > 0) {
                        // The user does have repos, so let's loop through them all.
                        for (int i = 0; i < response.length(); i++) {
                            try {
                                JSONObject jsonObject = response.getJSONObject(i);
                                dID = (short) jsonObject.getInt("id");
                                dProverb = jsonObject.getString("text").trim();
                                dSource = jsonObject.getString("source").trim() + " ";
                                theListOfAll.add(new Proverb(dID, dProverb, dSource));
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                    theFirstQuote = getRandom();
                    theNotification = theFirstQuote.getProverb() + " " + theFirstQuote.getTheSource();
                }
            },

            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    System.out.println(error);
                }
            }
    );
    // Add the request we just defined to our request queue.
    // The request queue will automatically handle the request as soon as it can.
    loadingQue.add(arrReq);
}

/**
 * Builds and delivers the notification.
 *
 * @param context, activity context.
 */
private void deliverNotification(Context context) {
    // Create the content intent for the notification, which launches
    // this activity
    Intent contentIntent = new Intent(context, MainActivity.class);

    PendingIntent contentPendingIntent = PendingIntent.getActivity
            (context, NOTIFICATION_ID, contentIntent, PendingIntent
                    .FLAG_UPDATE_CURRENT);
    // Build the notification
    NotificationCompat.Builder builder = new NotificationCompat.Builder
            (context, PRIMARY_CHANNEL_ID)
            .setSmallIcon(R.drawable.ic_stand_up)
            .setContentTitle(context.getString(R.string.notification_title))
            .setContentIntent(contentPendingIntent)
            .setStyle(new NotificationCompat.BigTextStyle()
                    .bigText(theNotification))
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .setAutoCancel(true)
            .setDefaults(NotificationCompat.DEFAULT_ALL);

    // Deliver the notification
    mNotificationManager.notify(NOTIFICATION_ID, builder.build());
}

}
...