2010-08-09 17 views
6

Inicializo algunas matrices en un método onUpdate() y luego, usando un intento y un botón, trato de invocar la función onReceive() que funciona bien pero no puede acceder a las matrices establecidas en el método onUpdate(). ¿Porqué es eso? Esas matrices son variables de objeto y se declaran públicas. ¿Me estoy perdiendo algo?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

¿Qué quiere decir con "no puedo acceder"? ¿Recibes algún tipo de excepción? el contenido está vacío? – DuduAlul

+0

Sí, excepción de puntero nulo. – dfilkovi

+0

puede agregar el código a su pregunta, eso haría las cosas más fáciles. – DuduAlul

Respuesta

4

Usted está recibiendo una instancia diferente de AppWidgetProvider (ya que se extiende 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."

Puede utilizar un servicio para evitar eso.

+0

Tengo un botón de actualización en mi widget, que me gustaría disparar "onUpdate" en el widget. ¿Puedo hacer eso en AppWidgetProvider o tengo que usar un pendingclickevent? Gracias. – Si8

0

De la API AppWidgetProvider:

onReady():. "Esto se llama para cada emisión y antes cada uno de los métodos de devolución de llamada anteriores Normalmente no es necesario poner en práctica este método porque la implementación AppWidgetProvider predeterminada filtra todas las transmisiones de Widget de aplicaciones y llama a los métodos anteriores según corresponda ".

lo que significa que OnReceive get() invocada ante onUpdate(), es por eso que está recibiendo nula

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

+0

No, lo sé, yo uso un receptor después de configurar los datos con si (intent.getAction(). Equals (ACTION_WIDGET_RECEIVER)) – dfilkovi

+0

añaden pieza corta de su código y voy a tratar de ser más útil .. – DuduAlul

+0

Agregué el código fuente – dfilkovi

Cuestiones relacionadas