2010-08-09 11 views
6

Inizializzo alcuni array in un metodo onUpdate() e successivamente, utilizzando un intent e un pulsante, provo a chiamare la funzione onReceive() che funziona bene ma non può accedere agli array impostati nel metodo onUpdate(). Perché? Quegli array sono variabili oggetto e sono dichiarati pubblici. Mi manca qualcosa?Widget onUpdate, onReceive

package net.aerosoftware.widgettest; 

import java.util.HashMap; 
import android.app.PendingIntent; 
import android.appwidget.AppWidgetManager; 
import android.appwidget.AppWidgetProvider; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 
import android.widget.RemoteViews; 

public class WidgetTest extends AppWidgetProvider { 

    public static String ACTION_WIDGET_RECEIVER = "ActionReceiverWidget"; 
    public HashMap<Integer, String> channelsImages; 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
    { 
     Log.e("UPDATE", "Start"); 
     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.main); 

     channelsImages = new HashMap<Integer, String>(); 
     channelsImages.put(0, "one"); 
     channelsImages.put(1, "two"); 

     Intent active = new Intent(context, WidgetTest.class); 
     active.setAction(ACTION_WIDGET_RECEIVER);  
     PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context, 0, active, 0); 
     remoteViews.setOnClickPendingIntent(R.id.buttonclick, actionPendingIntent); 

     super.onUpdate(context, appWidgetManager, appWidgetIds); 
     appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); 
     Log.e("UPDATE", "End"); 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     Log.e("RECEIVE", "Start 2"); 
     if (intent.getAction().equals(ACTION_WIDGET_RECEIVER)) 
     { 
      try 
      { 
       Log.e("SIZE", "Size Of channel array: "+channelsImages.size()); 
      } 
      catch(Exception e) 
      { 
       Log.e("ON_RECIEVE_ERROR", " "+e.getMessage()); 
      } 
     } 
     super.onReceive(context, intent); 
     Log.e("RECEIVE", "End"); 
    } 

} 
+2

Cosa intendete per "impossibile accedere"? Hai qualche tipo di eccezione? il contenuto è vuoto? – DuduAlul

+0

Sì, eccezione puntatore nullo. – dfilkovi

+0

puoi aggiungere il codice alla tua domanda, che renderebbe le cose più facili. – DuduAlul

risposta

4

Hai trovato una diversa istanza di AppWidgetProvider (in quanto si estende BroadcastReceiver)

API: "A BroadcastReceiver object is only valid for the duration of the call to onReceive(Context, Intent). Once your code returns from this function, the system considers the object to be finished and no longer active."

È possibile utilizzare un servizio per evitarlo.

+0

Ho un pulsante di aggiornamento nel mio widget, che mi piacerebbe attivare "onUpdate" nel widget. Posso farlo in AppWidgetProvider o devo usare un pendingclickevent? Grazie. – Si8

0

Dal API AppWidgetProvider:

onReady():. "Questo si chiama per ogni trasmissione e prima ciascuno dei metodi di callback di cui sopra Normalmente non è necessario implementare questo metodo perché l'implementazione predefinita di AppWidgetProvider filtra tutte le trasmissioni Widget app e chiama i metodi sopra indicati come appropriato. "

che significa che OnReceive() ottenere invocato prima onUpdate(), è per questo che si stanno ottenendo nulla

http://developer.android.com/reference/android/appwidget/AppWidgetProvider.html

+0

No, so che, io uso un ricevitore dopo ho impostato i dati con se (intent.getAction(). Equals (ACTION_WIDGET_RECEIVER)) – dfilkovi

+0

aggiungono breve pezzo di codice e cercherò di essere più utile .. – DuduAlul

+0

Ho aggiunto il codice sorgente – dfilkovi

Problemi correlati