Служба обновления виджетов приложений иногда закрывается - нужна помощь!

1

Справочная информация по этой проблеме. У меня есть приложение, связанное с моим приложением, которое периодически обновляется с установленными интервалами, используя службу обновлений, которая выполняет HTTP-сообщения на сервер и обновляет виджет с данными, полученными с сервера.

То, что я заметил из своих тестов и отчетов пользователей, заключается в том, что этот конкретный экземпляр принудительного закрытия происходит периодически (но редко), когда его время для обновления виджета и изменения состояния сети из доступных в недоступные. Поскольку я заметил это на своем телефоне в метро Нью-Йорка.

Во время отладки я понял, что если сообщение http произошло и состояние сети изменилось до получения ответа, оно в основном получает исключение IOException. Поэтому я обработал это исключение и обновил виджет в этом конкретном случае с обновлением по умолчанию. Он работал нормально.

Но интересно, что я снова заметил этот Force Close, и у меня заканчиваются идеи, как это разрешить.

Кто-нибудь сталкивался с этим раньше и знал, как я могу справиться с этим?

 java.lang.NullPointerException
    at android.widget.RemoteViews$ReflectionAction.writeToParcel(RemoteViews.java:399)
    at android.widget.RemoteViews.writeToParcel(RemoteViews.java:1003)
    at com.android.internal.appwidget.IAppWidgetService$Stub$Proxy.updateAppWidgetProvider(IAppWidgetService.java:402)
    at android.appwidget.AppWidgetManager.updateAppWidget(AppWidgetManager.java:283)
    at com.tyu.android.TyuWidget$UpdateService$1.run(TyuWidget.java:167)

Некоторые фрагменты кода, которые могут помочь всем вам, чтобы лучше понять проблему и помочь новичку.

@Override
public void onReceive(Context context, Intent intent) {
        check_intent = intent.getAction();
            if(check_intent.equals("android.appwidget.action.APPWIDGET_UPDATE")){
        this.onUpdate(context, intent);
        }   
}

Вот фрагмент кода метода OnUpdate.

    public void onUpdate(Context context, Intent intent){
            Intent widgetUpdate = new Intent(context, TyuWidget.class);
            widgetUpdate.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
            AlarmManager alarms = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
            PendingIntent newPending = PendingIntent.getBroadcast(context, 0, widgetUpdate,PendingIntent.FLAG_UPDATE_CURRENT);
            alarms.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime()+ PERIOD, newPending);
            context.startService(new Intent(context, UpdateService.class));

}

Поток внутри метода OnStart класса UpdateService, который обновляет виджет.

widgetUpdateThread = new Thread(){
                @Override
                public void run(){
                    RemoteViews updateViews = buildUpdate(getApplicationContext());
                    if(updateViews!=null){
                        ComponentName thisWidget = new ComponentName(getApplicationContext(), TyuWidget.class);
                        AppWidgetManager manager = AppWidgetManager.getInstance(getApplicationContext());
                        manager.updateAppWidget(thisWidget, updateViews);
                    }
                    else{
                        updateViews = new RemoteViews(getApplicationContext().getPackageName(), R.layout.tuwidget);
                        updateViews.setImageViewResource(R.id.ad, R.drawable.tyu_null_game);
                        Intent defineIntent1 = new Intent(getApplicationContext(), Tyu3.class);
                        PendingIntent pendingIntent1 = PendingIntent.getActivity(getApplicationContext(),
                                0 /* no requestCode */, defineIntent1, 0 /* no flags */);
                        updateViews.setOnClickPendingIntent(R.id.tuwidget, pendingIntent1);
                        ComponentName thisWidget = new ComponentName(getApplicationContext(), TyuWidget.class);
                        AppWidgetManager manager = AppWidgetManager.getInstance(getApplicationContext());
                        manager.updateAppWidget(thisWidget, updateViews);

                    }
                }
            };             
            widgetUpdateThread.start();  

buildUpdate фрагмент кода метода.

public RemoteViews buildUpdate(Context context) {   

httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
response = httpclient.execute(httppost);
entity = response.getEntity();
is = entity.getContent();

//etc etc...and then I return the update view and it gets updated.  
} 

Спасибо за помощь.

  • 0
    Из какой линии происходит NPE?
  • 0
    @Programmer Bruce manager.updateAppWidget (thisWidget, updateViews); внутри widgetUpdateThread run () ... вот что говорят мне отчеты Android Market Force Close. на com.tyu.android.TyuWidget $ UpdateService $ 1.run (TyuWidget.java:167)
Показать ещё 4 комментария
Теги:
android-appwidget

2 ответа

2
Лучший ответ

Поток внутри метода OnStart() класса UpdateService, который расширил класс службы, создавал проблему.

Решение:

Получил освобождение от виджета widgetUpdateThread и вместо расширения класса Service использовал IntentService. Это автоматически порождает поток и работает как шарм. Вместо OnStart при использовании IntentService я помещаю код внутри @Override onHandleIntent и Voila! Никакая сила не закрывается даже при параллельном использовании приложений, которые очень сильно загружаются в CPU и памяти, например, FruitNinja.

Ребята! IntentService настоятельно рекомендуется разработчиком и разработчиками Android Framework. Поэтому проверьте его при обновлении виджетов.

0

Я думаю, что значение thisWidget может быть пустым в manager.updateAppWidget(thisWidget, updateViews).

Надеюсь, это поможет. CD.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню