0

こんにちは皆さん、NULL POINTER EXCEPTION で問題が発生しています。ウィジェットを初めてホーム画面に配置したときにのみエラーが発生します。2 回目以降はウィジェットが完全に機能します。ウィジェットには構成アクティビティがあります。このアクティビティは起動しません。代わりに、ウィジェット プロバイダーの onReceive が呼び出され、NULL POINTER EXCEPTION を通過します。誰でも私の問題に良い解決策を提供できますか?

構成アクティビティとウィジェット プロバイダー クラスのコードを添付します。

ウィジェット構成クラス:

public class SingleNoteConfigure extends ListActivity  {


private NotesDbAdapter mDbHelper;
int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
public static String ACTION_WIDGET_LIST = "ActionReceiverList";
public static String ACTION_WIDGET_NEW = "ActionReceiverNew";



@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //set the result to canceled to allow the user
    //to change their mind mid widget configure
    setResult(RESULT_CANCELED);
    Log.d("MYTAG", "in the onCreate of of the widget configure");

    //set the layout file for the widget configure
    setContentView(R.layout.notes_list_config);

    //using the action bar title for user instruction
    setTitle("Select note to display on the wodget");

    // Find the widget id from the intent. 
    Intent intent = getIntent();
    Bundle extras = intent.getExtras();
    if (extras != null) {
        mAppWidgetId = extras.getInt(
                AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
    }
    Log.d("MYTAG", "in the onCreate");
    //stuff to get the database to open
    mDbHelper = new NotesDbAdapter(this);
    mDbHelper.open();

    //call the method that fills the list view
    fillData();

}

 @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);

        Cursor note = mDbHelper.fetchNote(id);
        startManagingCursor(note);
        String title = note.getString(note.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE));
        String text = note.getString(note.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY));



        RemoteViews views = new RemoteViews(this.getPackageName(), R.layout.singlenote_widget);
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this); 
        appWidgetManager.updateAppWidget(mAppWidgetId, views);    



        Log.d("MYTAG", "in the onListItemClick....");

        loadData(title, text, id);//here id is the row id of the selection;it is returned by the onListItemSelect 

        Intent resultValue = new Intent();
        resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);            
        setResult(RESULT_OK,resultValue);   
        finish();
 }



 void loadData(String title, String text, Long Id) {

    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this); 
    Log.d("MYTAG", "in the load data....");
    SingleNote.updateWidget(this, appWidgetManager, mAppWidgetId, title, text);
    NotesDbAdapter.updateWidgetId(mAppWidgetId,Id);

}

private void fillData() {
    Cursor notesCursor = mDbHelper.fetchAllNotes();
    startManagingCursor(notesCursor);
    Log.d("MYTAG", "in the fill data  of the widget configure");
    // Create an array to specify the fields we want to display in the list (TITLE and DATE)
    String[] from = new String[]{NotesDbAdapter.KEY_TITLE,NotesDbAdapter.KEY_DATE};


    // and an array of the fields we want to bind those fields to (title and date)
    int[] to = new int[]{R.id.title,R.id.date};


    // Now create a simple cursor adapter and set it to display
    SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.notes_row1, notesCursor, from, to);

    setListAdapter(notes);


}  
}

ウィジェットはクラスを提供します:

public class SingleNote extends AppWidgetProvider {

public static String UPDATE_ACTION = "ActionUpdateSinglenoteWidget";

private static NotesDbAdapter mDbHelper;



public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    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];            

        Log.d("MYTAG", "in the onUpdate");

        Intent intent = new Intent(context, Notepadv3.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.singlenote_widget);
        views.setOnClickPendingIntent(R.id.single_note_text, pendingIntent);  

        // Push update for this widget to the home screen

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

    }
}

@Override 
public void onReceive(Context context, Intent intent) { 
    Log.d("MYTAG", "in the onReceive....");
        String action = intent.getAction(); 
        Log.d("MYTAG", "in the onReceive....line 2");
        Bundle extras = intent.getExtras(); 
        Log.d("MYTAG", "in the onReceive....after bundle");//THis gets in the log 
        String title = extras.getString("title");
        Log.d("MYTAG", "in the onReceive....after title");//Non of the other log entry's
                                                          // make it in 
        String text = extras.getString("body");
        Log.d("MYTAG", "in the onReceive....after text");
        Log.d("MYTAG", "@ the point of int");
        int id = extras.getInt("widget_id");

        Log.d("MYTAG", action+ title + text + id);

        if (action != null && action.equals(UPDATE_ACTION)) { 
            final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 

            if (id > 0)
            {
                updateWidget(context, appWidgetManager, id ,title ,text);
            }
            else {
                return;

            }
    } 

    else { 
            super.onReceive(context, intent); 
    } 


}

static void updateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId, String title, String text){

    Log.d("MYTAG", "in the updatewidget method in the siglenote widget....");
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.singlenote_widget);
    views.setTextViewText(R.id.single_note_title, title);
    views.setTextViewText(R.id.single_note_text, text);
    appWidgetManager.updateAppWidget(appWidgetId, views);



}
}

ご覧のとおり、ログ エントリがいたるところにあり、ログ エントリが終了する時点でコメントしました。

このメソッドは activities の 1 つにあり、必要に応じてウィジェットを更新するために呼び出します。NULL POINTER EXCEPTION を取得しないように、メソッドの最後に「if(!null)」がありますが、役に立たないようです

private void updateWidget() { 
    Cursor note = mDbHelper.fetchWidgetId(mRowId);
    startManagingCursor(note);
    Log.d("MYTAG", "in the updatewidget method in edit note");
    int id = note.getInt(note.getColumnIndexOrThrow(NotesDbAdapter.KEY_WIDGET_ID));//here id is the widget id we get out of the database
    Intent i = new Intent(this, SingleNote.class); 
    i.setAction(SingleNote.UPDATE_ACTION); 
    i.putExtra("title", mTitleText.getText().toString());
    i.putExtra("body", mBodyText.getText().toString());
    i.putExtra("widget_id",id);
    String title = mTitleText.getText().toString();
    //String body =  mBodyText.getText().toString();
    if(title != null){ 
    sendBroadcast(i); 
    }

スタック トレースを編集します。

    07-12 04:08:36.473: E/STACKTRACE_TAG(2615): STACKTRACE
    07-12 04:08:36.483: E/STACKTRACE_TAG(2615): java.lang.NullPointerException
    07-12 04:08:36.483: E/STACKTRACE_TAG(2615):     at drkstr.yan.SingleNote.onReceive(SingleNote.java:58)
    07-12 04:08:36.483: E/STACKTRACE_TAG(2615):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:1994)
    07-12 04:08:36.483: E/STACKTRACE_TAG(2615):     at android.app.ActivityThread.access$2400(ActivityThread.java:132)
    07-12 04:08:36.483: E/STACKTRACE_TAG(2615):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1093)
    07-12 04:08:36.483: E/STACKTRACE_TAG(2615):     at android.os.Handler.dispatchMessage(Handler.java:99)
    07-12 04:08:36.483: E/STACKTRACE_TAG(2615):     at android.os.Looper.loop(Looper.java:143)
    07-12 04:08:36.483: E/STACKTRACE_TAG(2615):     at android.app.ActivityThread.main(ActivityThread.java:4196)
    07-12 04:08:36.483: E/STACKTRACE_TAG(2615):     at java.lang.reflect.Method.invokeNative(Native Method)
    07-12 04:08:36.483: E/STACKTRACE_TAG(2615):     at java.lang.reflect.Method.invoke(Method.java:507)
    07-12 04:08:36.483: E/STACKTRACE_TAG(2615):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    07-12 04:08:36.483: E/STACKTRACE_TAG(2615):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    07-12 04:08:36.483: E/STACKTRACE_TAG(2615):     at dalvik.system.NativeStart.main(Native Method)
    07-12 04:08:45.483: E/STACKTRACE_TAG(2615): STACKTRACE
    07-12 04:08:45.483: E/STACKTRACE_TAG(2615): java.lang.NullPointerException
    07-12 04:08:45.483: E/STACKTRACE_TAG(2615):     at drkstr.yan.SingleNote.onReceive(SingleNote.java:58)
    07-12 04:08:45.483: E/STACKTRACE_TAG(2615):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:1994)
    07-12 04:08:45.483: E/STACKTRACE_TAG(2615):     at android.app.ActivityThread.access$2400(ActivityThread.java:132)
    07-12 04:08:45.483: E/STACKTRACE_TAG(2615):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1093)
    07-12 04:08:45.483: E/STACKTRACE_TAG(2615):     at android.os.Handler.dispatchMessage(Handler.java:99)
    07-12 04:08:45.483: E/STACKTRACE_TAG(2615):     at android.os.Looper.loop(Looper.java:143)
    07-12 04:08:45.483: E/STACKTRACE_TAG(2615):     at android.app.ActivityThread.main(ActivityThread.java:4196)
    07-12 04:08:45.483: E/STACKTRACE_TAG(2615):     at java.lang.reflect.Method.invokeNative(Native Method)
    07-12 04:08:45.483: E/STACKTRACE_TAG(2615):     at java.lang.reflect.Method.invoke(Method.java:507)
    07-12 04:08:45.483: E/STACKTRACE_TAG(2615):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    07-12 04:08:45.483: E/STACKTRACE_TAG(2615):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    07-12 04:08:45.483: E/STACKTRACE_TAG(2615):     at dalvik.system.NativeStart.main(Native Method)

主な質問は次のとおりです。 1. アプリケーションを新規インストールした後、初めてウィジェットを配置したときにのみこれが発生するのはなぜですか? 2. ウィジェット configure の前に onRecieve が呼び出されるのはなぜですか? 3. 最後に、どうすれば解決できますか。

時間を割いてこれを読んでくれてありがとう。

4

1 に答える 1

1

注意すべき主な点は、NullPointerExceptionatがあることですSingleNote.java:58

extrasどのステートメントがログに表示されるかについてのコメントから判断すると、それは null であると思います。つまり、 Intent に余分なものがないことを意味します。それが初めて起こるのであれば、それは理にかなっています。使用する前にエクストラをヌルチェックしてください。

于 2013-07-11T19:45:44.170 に答える