Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:在不阻塞UI线程的情况下从AsyncTask获取返回值_Java_Android_Android Asynctask - Fatal编程技术网

Java Android:在不阻塞UI线程的情况下从AsyncTask获取返回值

Java Android:在不阻塞UI线程的情况下从AsyncTask获取返回值,java,android,android-asynctask,Java,Android,Android Asynctask,在活动的onCreate中,我执行以下操作: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AsyncTask<String, Integer, String[]> asynctask = new DownloadFilesTask(this.getActivity()).execute(url);

活动的
onCreate
中,我执行以下操作:

@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);
}
@覆盖
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
AsyncTask AsyncTask=new DownloadFilesTask(this.getActivity()).execute(url);
字符串[]值=null;
试一试{
values=asynctask.get();
}捕获(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}
Log.d(“异步任务”,“完成!”);
ArrayAdapter=新的ArrayAdapter(getActivity(),
android.R.layout.simple_list_item_1,值);
setListAdapter(适配器);
}
这是可行的,但是我用
asynctask.get()阻塞了UI线程,它阻止我在执行后台任务期间显示任何新的UI元素,如对话框

因此,我的问题是:在给定此代码的情况下,如何在不阻塞UI线程的情况下从AsyncTask中获取结果值?

设计为从内部调用。基本上,后者是在完成或抛出异常之后在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 */}
    }
}

设计为从内部调用。基本上,后者是在完成或抛出异常之后在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 */}
    }
}

将其移动到
onPostExecute

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

setListAdapter(adapter);
ArrayAdapter=新的ArrayAdapter(getActivity(),
android.R.layout.simple_list_item_1,值);
setListAdapter(适配器);

将此移动到
onPostExecute

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

setListAdapter(adapter);
ArrayAdapter=新的ArrayAdapter(getActivity(),
android.R.layout.simple_list_item_1,值);
setListAdapter(适配器);

1-您是否也可以发布下载文件任务


2-当asyncTask执行时,它不会被加载,或者不管你在做什么,都不会立即发生,对吗?所以,在调用asynctask之后,您可能无法从中获得结果。。。因此,我建议您使用asyncTask的onPostExecute方法-您是否也可以发布下载文件任务


2-当asyncTask执行时,它不会被加载,或者不管你在做什么,都不会立即发生,对吗?所以,在调用asynctask之后,您可能无法从中获得结果。。。所以我建议您使用asyncTask的onPostExecute方法

实际上不是,因为在onPostExecute中您有一个(令人惊讶的!)结果变量。。。get()用于强制非异步行为…@Selvin你是什么意思?你能详细解释一下吗?@Selvin你是对的,我一定是被弄糊涂了。实际上不是,因为在onPostExecute中,你有一个(令人惊讶的!)结果变量。。。get()用于强制非异步行为…@Selvin你是什么意思?你能详细解释一下吗?@Selvin你说得对,我一定被你弄糊涂了。你的回答最直截了当。现在可以用了,谢谢!在使用AsyncTasks时,请确保考虑到在调用postExecute时,用户已导航离开,而您的UI已死亡的情况。您得到了最直接的答案。现在可以用了,谢谢!在使用AsyncTasks时,请确保考虑到在调用postExecute时,用户已导航离开而UI已死亡的情况。