2013-12-21 30 views
1

我有一個簡單的小部件,我嘗試在onUpdate方法之外更新其內容。我創建了:context和appWidgetManager字段變量,並且編譯器沒有提供任何錯誤,但是我在聲明AppWidgetManager的那兩行上收到NullPointerException。AppWidgetManager在onUpdate之外?

有人可以幫我理解爲什麼把這些變成字段變量使NPE仍然存在嗎?

private void ref(int z) { 

    views.setTextViewText(R.id.igePrint, ige[z].azIge); 

    AppWidgetManager manager = AppWidgetManager.getInstance(context); 
    manager.updateAppWidget(thisWidget, views); 
    //Log.e("<<check value>>", "the value of z is: " + z); 
} 

和部分代碼的其餘部分:

package com.example.napiige; 
import android.appwidget.AppWidgetManager; 
import android.appwidget.AppWidgetProvider; 
import android.content.ComponentName; 
import android.content.Context; 
import android.os.Handler; 
import android.os.Message; 
import android.util.Log; 
import android.widget.RemoteViews; 
import android.widget.TextView; 

public class MainActivity extends AppWidgetProvider { 

    RemoteViews views; 
    String azIge; 
    String igeBack; 
    static MainActivity[] ige = new MainActivity[3]; 
    int x; 
    public static ComponentName thisWidget; 

    Handler handler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      x = (Integer)msg.obj; 
      ref(x); 
     }  

     }; 

    Context context; 


    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 

     views = new RemoteViews(context.getPackageName(), R.layout.example_appwidget); 
     thisWidget = new ComponentName(context, MainActivity.class); 

     final int N = appWidgetIds.length; 
     // Perform this loop procedure for each App Widget that belongs to this provider 
     for (int i=0; i<N; i++) { 
     int appWidgetId = appWidgetIds[i]; 

     String ig1 = context.getString(R.string.ige1); 
     String ig2 = context.getString(R.string.ige2); 
     String ig3 = context.getString(R.string.ige3); 

     ige = new MainActivity[3]; 

     ige[0] = new MainActivity(); 
     ige[1] = new MainActivity(); 
     ige[2] = new MainActivity(); 

     ige[0].azIge = ig1; 
     ige[1].azIge = ig2; 
     ige[2].azIge = ig3; 


     Runnable myRunnable1 = new Task(); 
     Thread myThread = new Thread(myRunnable1); 
     myThread.start(); 

     appWidgetManager.updateAppWidget(thisWidget, views); 

     } 
    } 

    private void ref(int z) { 

     views.setTextViewText(R.id.igePrint, ige[z].azIge); 

     AppWidgetManager manager = AppWidgetManager.getInstance(context); 
     manager.updateAppWidget(thisWidget, views); 
     //Log.e("<<check value>>", "the value of z is: " + z); 

    } 


    class Task implements Runnable { 
    @Override 
     public void run() {    
      for (int i = 0; i < 3; i++) {     
       try { 
       Thread.sleep(3000); 
       // refreshing the text inside the loop calling the above refreshTextView method 

       int data = i; 

       Message msg = handler.obtainMessage(1, (int)data); 
       handler.sendMessage(msg); 

       } catch (InterruptedException e) { 
        e.printStackTrace(); 
      } 
     } 
    } 
    } 

} 

回答

1

appWidgetManager字段爲空,因爲有你從來沒有給它分配一個值。

+0

感謝您的建議@託恩博格斯...我試圖增加一個值,但我結束了另一個NullPointerException,我無法找到一種方法來從onUpdate內部目標... :(我是什麼已嘗試:「AppWidgetManager經理= AppWidgetManager.getInstance(上下文); manager.updateAppWidget(thisWidget,views);」 - 你能演示使用一些代碼嗎?(我更新了頁面頂部的代碼) –