1

在我onCreate执行Activity以下操作:

@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 元素,如对话框。

所以我的问题是:如何从我的 AsyncTask 获取结果值而不阻塞给定此代码的 UI 线程?

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()后,在 UI 线程上执行,并将结果作为方法参数onPostExecute(Result result)传递。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 回答