0

アプリで AsyncHTTPClient(loopj.com/android-async-http/) を使用して過剰な json api を使用しています。asynchttpclient が作業を完了する前にユーザーが戻るボタンを押した場合を除いて、正常に動作します。アプリがクラッシュします。これが私のonFinish()メソッドコードです。

@Override
                public void onFinish(){
                    super.onFinish();
                    if(nodata == false){
                        getActivity().runOnUiThread(new Runnable() {
                            public void run() {
                                /**
                                 * Updating parsed JSON data into ListView
                                 * */
                                adapter=new AlbumListAdapter(AlbumsListActivity.this, tracksList);
                                lv.setAdapter(adapter);
                                adapter.notifyDataSetChanged();

                                setTitle(activity_title);
                                findViewById(R.id.loading_layout).setVisibility(View.GONE);
                                lv.setVisibility( View.VISIBLE );
                            }
                        });
                    }else{
                        runOnUiThread(new Runnable() {
                            public void run() {
                                adapter=new AlbumListAdapter(AlbumsListActivity.this, tracksList);
                                lv.setAdapter(adapter);
                                adapter.notifyDataSetChanged();

                                findViewById(R.id.loading_layout).setVisibility(View.GONE);
                                lv.setEmptyView(findViewById(R.id.empty_list_item));
                                lv.setVisibility( View.VISIBLE );
                            }
                        });
                    }
                }
            });

ここにスタックトレースがあります

 FATAL EXCEPTION: main
 java.lang.NullPointerException
 10-03 15:58:02.732: E/AndroidRuntime(19532):   at com.example.ListFragment$2.onFinish(ListFragment.java:423)
 10-03 15:58:02.732: E/AndroidRuntime(19532):   at com.loopj.android.http.AsyncHttpResponseHandler.handleMessage(AsyncHttpResponseHandler.java:194)
 10-03 15:58:02.732: E/AndroidRuntime(19532):   at com.loopj.android.http.AsyncHttpResponseHandler$1.handleMessage(AsyncHttpResponseHandler.java:84)
 10-03 15:58:02.732: E/AndroidRuntime(19532):   at android.os.Handler.dispatchMessage(Handler.java:99)
 10-03 15:58:02.732: E/AndroidRuntime(19532):   at android.os.Looper.loop(Looper.java:137)
 10-03 15:58:02.732: E/AndroidRuntime(19532):   at android.app.ActivityThread.main(ActivityThread.java:4448)
 10-03 15:58:02.732: E/AndroidRuntime(19532):   at java.lang.reflect.Method.invokeNative(Native Method)
 10-03 15:58:02.732: E/AndroidRuntime(19532):   at java.lang.reflect.Method.invoke(Method.java:511)
 10-03 15:58:02.732: E/AndroidRuntime(19532):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
 10-03 15:58:02.732: E/AndroidRuntime(19532):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
 10-03 15:58:02.732: E/AndroidRuntime(19532):   at dalvik.system.NativeStart.main(Native Method)

私はアンドロイドが初めてで、私がやっているかもしれない何か問題がある場合は、指摘してください。助けてください、よろしくお願いします!

4

2 に答える 2

1

method の行番号にアクセスしないと、特定のエラーが何であるかを判断するのは困難onFinish()です。

ただし、スタック トレースの一番上の行はNullPointerException

com.example.ListFragment$2.onFinish(ListFragment.java:423)

これは、コード内の 423 行を見つける必要があることを示しています。これにより、アクセスしようとしている値が null の変数を絞り込むことができます。

たとえば、行 423 が次の行であることがわかったとします。

lv.setAdapter(adapter);

lvが null であることを確認し、その理由をデバッグできます。

于 2013-10-03T11:03:29.253 に答える
1

バック プレスの結果としてアプリケーションが閉じられたときに保留中の要求がある場合、NullPointerException が発生する可能性があります。通常、私の場合はコールバック ハンドラにあります。AsyncHttpClient で .cancelRequest を呼び出すと、この問題が解決することがわかりました。私の場合、バックプレスが発生してアプリケーションが終了するたびに呼び出されるアクティビティの onDestroy() で呼び出します。

Context context = this; // "this" is the Activity used by the client
client.cancelRequests(context, true);

Javadocでは、メソッド定義でこれについて説明しています。

于 2014-01-17T07:52:02.897 に答える