У меня есть два приложения, которые прекрасно работают, но я не могу собрать их вместе. Одно приложение загружает список цитат известных людей (в формате 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());
}
}