2

doInBackgroundメソッドでJSONArrayを読み取り、カスタムアイテムのArrayList(ArrayList)を返すAsyncTaskを作成しました。この前に、onPostExecuteメソッドで、AsyncTaskでチャージされたArrayListをメインスレッドの別のArrayListに移動しますが、AsyncTaskが終了せず、引き続き機能していると思います。ここに私のコードを置きます:

ここでAsyncTask:

private class ReadJSONTask extends AsyncTask<Void, Void, ArrayList<Item>>{

        @Override
        protected ArrayList<Item> doInBackground(Void... params) {
            // TODO Auto-generated method stub
            ArrayList<Item> auxList = new ArrayList<Item>();
            LoadData(auxList); //Method that reads JSON and load information in the ArrayList
            return auxList; // Return ArrayList
        }

        @Override
        protected void onPostExecute(ArrayList<Item> result) {
            // TODO Auto-generated method stub

            Log.i("OnPostExecute", String.valueOf(result.size()));  //The size of the array
            listMain = result; // Move the data of the AsyncTask to the main Thread

            Log.i("OnPostExecute", String.valueOf(listaComic.size()));  //The size of the ArrayList I use in the Main Thread
        }

    }

ここで、メインスレッドでのAsyncTaskの呼び出しは次のとおりです。

if (isOnline()){    //Return true if there is internet connection
    ReadJSONTask task = new ReadJSONTask();
    task.execute();

    Log.i("Main Thread - listMain Size", String.valueOf(listMain.size())); //Never executed

    //This for loop its only for debug purposes, never executed
    for (Item item : listMain){ 
        Log.i("Items", item.toString());
    }
}

ログには、onPostExecute()メソッドのすべてのログが出力されていることがわかりますが、メインスレッドからは何も出力されていません。

私はそれを修正するためのエラーがどこにあるのかわかりません、私はそれを2日間取り組んでいて、フォーラム、ここStackOverflowで検索しています、そして私はそれを修正することができません:S

4

1 に答える 1

4

名前が示すようAsyncTask非同期execute()ですが、非同期タスクが終了しない限り、何らかの理由でブロックされることを期待しています。これは間違っています。コードは正常に機能し、listMainは単に空であり、asynctaskを起動するとexecute()for非同期タスクがまだ実行されていないため、何も表示されないことを期待しています。アプリロジックを作り直して、非同期タスクが「メインスレッド」に終了したことを通知できるようにする必要があります。forつまり、ループを別のメソッドに移動し、から呼び出しますonPostExecute()

于 2012-11-10T15:53:25.450 に答える