2011-01-07 10 views
8

Mam problem podczas aktualizowania widgetu ręcznie za pomocą AppWidgetManager.updateAppWidget. Platforma to Android 2.2.Widżet sterowania zasilaniem pokazany na krótką chwilę podczas aktualizowania mojego własnego widgetu za pomocą AppWidgetManager, na czym polega problem?

Oto kod:
oświadczyłem widget dodatkowo do istniejącej działalności w manifeście:

<receiver android:name=".Widget" android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
     </intent-filter> 
     <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget" /> 
</receiver> 

Widget klasy został ogłoszony w Widget.java:

public class Widget extends AppWidgetProvider { 
@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
    int use_static_ip; 
    RemoteViews remoteViews; 

    try { 
     use_static_ip = Settings.System.getInt(context.getContentResolver(), Settings.System.WIFI_USE_STATIC_IP); 
     if (use_static_ip == 0) { //DHCP 
      remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_dhcp); 
     } else { //static IP 
      remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_static); 
     } 
     Intent call_activity = new Intent(context, StaticIPToggle.class); 
     PendingIntent pending_call_activity = PendingIntent.getActivity(context, 0, call_activity, 0); 
     remoteViews.setOnClickPendingIntent(R.id.widget_icon, pending_call_activity); 
     appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); 
    } catch (SettingNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
} 

W istniejącym działaniu dodałem kilka linii, aby ręcznie zaktualizować widżet:

 AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext()); 
     ComponentName componentName = new ComponentName(getApplicationContext(), Widget.class); 
     int[] ids = appWidgetManager.getAppWidgetIds(componentName); 
     Intent update_widget = new Intent(); 
     update_widget.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids); 
     update_widget.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
     getApplicationContext().sendBroadcast(update_widget); 

Ale teraz mam tego błędu: Jeśli widget jest włączony, pokazuje widget ustawień energii na krótki okres (~ 0,5sec-1sec), zanim pojawi się żądany widget.

Oto zrzut ekranu z tym problemem (kolejność od lewej do prawej): http://i.stack.imgur.com/rHkjw.jpg

pierwsze istnieje widżet jak na lewym zdjęciu, a następnie zmienia się na środku obrazu i albo pozostaje tam lub zmiany w prawym obrazie ~ 0,5-1 sek.

Niestety nie widzę żadnego błędu w kodzie, prawda?

Mam nadzieję, że może mi pomóc rozwiązać ten problem;) góry dzięki, pozdrowienia, Oli

+0

Wow, mam ten sam problem; dobrze widzieć, że to nie tylko ja, to trudny problem do opisania. Dostaję błąd w HTC EVO 4G z niestandardową 2.2 ROM, ale nie w emulatorze. Problem ten nie zdarza się również w przypadku Samsung Galaxy S. Każdy ma rozwiązanie? Zmagałem się z tym przez jakiś czas. – Bobby

+0

Widziałem to przez testowanie widgetu scrollablecontacts-widget, w którym źródłem jest [tutaj] (http://code.google.com/p/scrollablecontacts/) w niestandardowym programie uruchamiającym, który próbuje dodać widżet do wielu kontaktów. Może to być związane z zbyt długim ładowaniem kodu, aby załadować zawartość widżetu, może zrobić ładowanie w usłudze uruchomionej z klasy widgetów? –

Odpowiedz

0

miałem dokładnie ten sam problem. Rozwiązałem go ręcznie aktualizując widżet NIE poprzez transmisję, ale bezpośrednio wywołując AppWidgetManager.updateAppWidget(ComponentName, RemoteViews) z AsyncTask.

Spróbuj wewnątrz widżet klasy:

/** 
* Asynchronously builds views and updates the widget. 
*/ 
private static class UpdateWidgetTask extends AsyncTask<Void, Void, RemoteViews> { 
    private AppWidgetManager mAppWidgetManager; 
    private Context mContext; 

    private UpdateWidgetTask(AppWidgetManager appWidgetManager, Context context) { 
     mAppWidgetManager = appWidgetManager; 
     mContext = context; 
    } 

    @Override 
    protected RemoteViews doInBackground(Void... params) { 
     DebugLog.d(TAG, "Asynchronously updating widget."); 
     RemoteViews views = buildUpdate(mContext); 
     return views; 
    } 

    @Override 
    protected void onPostExecute(RemoteViews views) { 
     ComponentName thisWidget = new ComponentName(mContext, Widget.class); 
     mAppWidgetManager.updateAppWidget(thisWidget, views); 
    } 
} 

/** 
* Asynchronously updates all widgets of this type. This is the fastest way to update the widget. 
* 
* @param context The context. 
*/ 
public static void updateWidget(Context context) { 
    new UpdateWidgetTask(AppWidgetManager.getInstance(context), context).execute(); 
} 

Następnie zaktualizować wywołując Widget.updateWidget (this) z działalności.

0

Użyłem tej samej, zaprogramowanej metody ręcznej aktualizacji widgetu, tak jak to zrobiłeś (Od Is it possible to throw an intent for APPWIDGET_UPDATE programmatically?) i okazało się, że jest to dokładna przyczyna problemu.

To nadal dzieje się na 4.2 i 2.3, oficjalnych i nieoficjalnych ROMach (Touchwiz jest całkowicie szalony, gdy tak się dzieje).

Jedyny sposób mogę rozwiązać ten problem było usunąć całą aktualizację obejmujące transmisję i zaktualizować widget zdalnie wysyłając regularne Broadcast do dostawcy widget i nazywając

ComponentName thisWidget = new ComponentName(context,AvailabilityWidgetProvider.class); 
AppWidgetManager.getInstance(context).updateAppWidget(thisWidget,views); 

od wewnątrz onReceive

(Działa to dla mnie, ponieważ moje widżety są identyczne)

W ten sposób problem nie pojawił się i mogłem zdalnie zaktualizować widget. Stare pytanie, wiem, ale zasługuje na odpowiedź, ponieważ to wszystko, co mogłem znaleźć w tym dziwnym zagadnieniu.

Powiązane problemy