1

の中onCreateActivity私は次のことをします:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);         
    AsyncTask<String, Integer, String[]> asynctask = new DownloadFilesTask(this.getActivity()).execute(url);
    String[] values = null;         
    try {
        values = asynctask.get();
    } catch (InterruptedException e) {          
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
    Log.d("AsyncTask", "DONE!");        
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
            android.R.layout.simple_list_item_1, values);

    setListAdapter(adapter);
}

これは機能しますが、UIスレッドをブロックしてasynctask.get();いるため、実行するバックグラウンドタスク中にダイアログなどの新しいUI要素が表示されなくなります。

だから私の質問:このコードでUIスレッドをブロックせずにAsyncTaskから結果値を取得するにはどうすればよいですか?

4

3 に答える 3

5

これを移動しonPostExecuteます:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
        android.R.layout.simple_list_item_1, values);

setListAdapter(adapter);
于 2013-02-27T19:46:31.490 に答える
1

get()内部から呼び出されるように設計されていますonPostExecute(Result result)doInBackground()基本的に後者は、終了直後または例外をスローした直後にUIスレッドで実行されます。

例えば:

class DownloadFilesTask extends AsyncTask<Params, Progress, Result>
{
    @Override
    public Result doInBackground(Params... params)
    {
        // ...
    }

    @Override
    public void onPostExecute(Result result)
    {
        try
        {
            Result result = get();

            // we are fine here, do something with the result
        }
        catch(CancellationException e){/* if cancel() is called on this instance */}
        catch(ExecutionException e){/* if doInBackground() throws some exception */}
        catch(InterruptedException e){/* If the current thread was interrupted while waiting */}
    }
}


編集:SwingWorker私は:\と混同する必要があります

doInBackground()終了後onPostExecute(Result result)、UIスレッドで実行されdoInBackground()、メソッドパラメータとして結果が渡されます。

class DownloadFilesTask extends AsyncTask<Params, Progress, Result>
{
    @Override
    public Result doInBackground(Params... params)
    {
        // ...
    }

    @Override
    public void onPostExecute(Result result)
    {
        // do something with the result
    }
}
于 2013-02-27T19:45:48.547 に答える
0

1- DownloadFilesTaskも投稿できますか?

2- asyncTaskが実行されると、ロードされないか、何をしているのか、すぐには発生しませんよね?したがって、asynctaskを呼び出した直後は、結果を取得できない場合があります...したがって、asyncTaskのonPostExecuteメソッドを使用することをお勧めします。

于 2013-02-27T19:48:31.547 に答える