Обновление Android AppWidget после сервиса Volley - PullRequest
0 голосов
/ 03 июля 2018

Активность конфигурации для моего виджета запускает службу, которая отправляет запрос http и обновляет представления виджета. Я могу просто обновить представления из службы (см. Ниже), но почему я не могу обновить их из обработчика ответа?

public class TestService extends Service {

    @SuppressWarnings("unused")
    private static final String TAG = "TestService";

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "Service started");

        final Context context = this;
        final RemoteViews views = new RemoteViews(getPackageName(), R.layout.widget_activity);
        final ComponentName thisWidget = new ComponentName(context, WidgetActivity.class);

        final RequestQueue queue = Volley.newRequestQueue(this);
        final String url = "http://google.com";

        final AppWidgetManager manager = AppWidgetManager.getInstance(context);
        final int[] ids = manager.getAppWidgetIds(thisWidget);

        StringRequest request = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {

                        // DOES NOT WORK
                        views.setTextViewText(R.id.last_updated_text, "After Request");
                        manager.partiallyUpdateAppWidget(ids, views);

                        // ALSO DOES NOT WORK
                        new Handler(Looper.getMainLooper()).post(new Runnable() {
                            @Override
                            public void run() {
                                views.setTextViewText(R.id.last_updated_text, "After Request");
                                manager.partiallyUpdateAppWidget(ids, views);
                            }
                        });

                        // ALSO DOES NOT WORK
                        new Handler(Looper.getMainLooper()).post(new Runnable() {
                            @Override
                            public void run() {
                                views.setTextViewText(R.id.last_updated_text, "After Request");
                                AppWidgetManager.getInstance(context).updateAppWidget(thisWidget, views);
                            }
                        });

                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        error.printStackTrace();
                    }
                }
        );

        queue.add(request);

        // WORKS
        views.setTextViewText(R.id.last_updated_text, "Before Request");
        manager.partiallyUpdateAppWidget(ids, views);

        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

}

EDIT

Я перезапустил свое устройство, и теперь, кажется, все работает нормально:

StringRequest priceRequest = new StringRequest(Request.Method.GET, url,
        new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                Log.d(TAG, "Result: " + response);

                views.setTextViewText(R.id.last_updated_text, "After Request");
                AppWidgetManager.getInstance(context).updateAppWidget(thisWidget, views);

            }
        },
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        }
);

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Когда мы обновляем данные AppWidget, нам нужно вызвать этот метод -> notifyAppWidgetViewDataChanged (int [] appWidgetIds, int viewId).

 manager.notifyAppWidgetViewDataChanged(ids, views);
0 голосов
/ 03 июля 2018

Вы можете обновлять представления для Android только с помощью пользовательского интерфейса.

Попробуйте обновить виджет в потоке пользовательского интерфейса, как.

new Handler(Looper.getMainLooper()).post(...runnable)
...