0

AsyncTaskWeb から文字列をダウンロードするためにアクティビティから を呼び出しています。文字列がダウンロードされたら、文字列をアクティビティに渡して解析し、ListView.

アクティビティで呼び出されるメソッドを作成しましたonPostExecute()。コードは次のとおりです。

@Override
    protected void onPostExecute(String res) {   
        IndexPicker index = new IndexPicker();
        index.onAsyncFinish(res);
    }

これは私のonASyncFinish()方法です:

public void onAsyncFinish(String json) {
        ArrayList<Index> arrayList = parseJSON(json);
        populateListView(arrayList);
    }
}

メソッド内で、populateListViewArrayAdapter のコンストラクターが呼び出されたときに IllegalStateException が発生します。

public IndexItemAdapter(Context context, int layoutResourceId,
            ArrayList<Index> data) {
        super(context, layoutResourceId, data); // This line.
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    } 

これはlogcatです:

E/AndroidRuntime(821): FATAL EXCEPTION: main
E/AndroidRuntime(821): java.lang.IllegalStateException: System services not available to Activities before onCreate()
E/AndroidRuntime(821):  at android.app.Activity.getSystemService(Activity.java:4463)
E/AndroidRuntime(821):  at android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
E/AndroidRuntime(821):  at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:153)
E/AndroidRuntime(821):  at com.test.exampleapp.index.IndexItemAdapter.<init>(IndexItemAdapter.java:23)
E/AndroidRuntime(821):  at com.test.exampleapp.activity.IndexPicker.populateListView(IndexPicker.java:39)
E/AndroidRuntime(821):  at com.test.exampleapp.activity.IndexPicker.onAsyncFinish(IndexPicker.java:56)
E/AndroidRuntime(821):  at com.test.exampleapp.async.DownloadIndexJSON.onPostExecute(DownloadIndexJSON.java:45)
E/AndroidRuntime(821):  at com.test.exampleapp.async.DownloadIndexJSON.onPostExecute(DownloadIndexJSON.java:1)
E/AndroidRuntime(821):  at android.os.AsyncTask.finish(AsyncTask.java:631)
E/AndroidRuntime(821):  at android.os.AsyncTask.access$600(AsyncTask.java:177)
E/AndroidRuntime(821):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
E/AndroidRuntime(821):  at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(821):  at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(821):  at android.app.ActivityThread.main(ActivityThread.java:5039)
E/AndroidRuntime(821):  at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(821):  at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(821):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
E/AndroidRuntime(821):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
E/AndroidRuntime(821):  at dalvik.system.NativeStart.main(Native Method)

調査した結果、明らかに問題は、を使用して onASyncFinish メソッドを呼び出す方法ですIndexPicker index = new IndexPicker();。テストとしてメインスレッドでネットワークを実行しようとしたとき、リストビューが正しく読み込まれたため、これは正しいと思います。

私の質問は、これを修正して ASyncTask の結果をアクティビティに渡し、リスト ビューにデータを入力できるようにするための最良の方法は何でしょうか。

4

2 に答える 2

1

私はそれIndexPickerがあなたActivityの であると仮定しています。その場合、それをインスタンス化するのは本当に悪いことです(有効な を持たないためContext(例外があなたに伝えていることとまったく同じです))。アクティビティは手動でインスタンス化しないでください。アクティビティは Android システムによって作成および処理されます。

代わりに、必要なことを行うには、(のコンストラクターで)Activity開始する場所からへの参照を渡し、その参照を使用してコールバックを呼び出す必要があります。AsyncTaskAsyncTaskonAsyncFinishonPostExecute

于 2012-12-31T15:27:58.563 に答える
0

ここで2つの可能な解決策:

One :: ASyncTask への Listview Reference を送信し、ASyncTask が終了したらデータを listview にバインドします。

2:: アクティビティのリストビューにデータをバインドし、最初に ASyncTask が完了していることを確認してから、データをバインドします。ASyncTask からデータを取得するには、 ASyncTask クラスでメソッドを作成して終了時に呼び出す必要があります。このメソッドの戻り値の型はデータを返します。

しかし、ASyncTask が完了したことを確認するには、1 つのスレッドを実行する必要があるため、2 番目の方法は良くないと思います。

ありがとう

于 2012-12-31T15:30:41.690 に答える