android - 从 AsyncTask 返回数据而不阻塞 UI

标签 android android-asynctask

我有一个与 AsyncTask 类相关的概念性问题。我们使用 AsyncTask 这样主 UI 就不会被阻塞。 但是假设,我想从设备的内存中检索一些数据,为此我使用 AsyncTask 类。相关代码行如下(假设返回的数据类型为String):

  //code
    String data = new ExtendedAsyncTask().execute(param1, param2).get();
  //use this returned value.

上面的行不会阻塞 UI,破坏使用 AsyncTask 的目的吗?如果是,那么如何在不阻塞 UI 的情况下获取相关数据?我想补充一点,下一行代码将需要此数据来执行某些任务,因此取决于返回值。

谢谢

最佳答案

get() 方法将阻塞 UI 线程。要获取相关数据,您需要从 doInBackground 返回值并捕获 onPostExecute 参数中的值。

Value returned by doInBackground is captured by onPostExecute method

例子:

public class BackgroundTask extends AsyncTask<String, Integer, String >{
       private ProgressDialog mProgressDialog;
       int progress;
       public BackgroundTask() {
           mProgressDialog = new ProgressDialog(context);
             mProgressDialog.setMax(100);
             mProgressDialog.setProgress(0);
    }

       @Override
    protected void onPreExecute() {
           mProgressDialog =ProgressDialog.show(context, "", "Loading...",true,false);
        super.onPreExecute();
    }
     @Override
     protected void onProgressUpdate(Integer... values) {
     setProgress(values[0]);
  }

    @Override
    protected String doInBackground(String... params) {
            String data=getDatafromMemoryCard();    

        return data;  // return data you want to use here
    }
    @Override
    protected void onPostExecute(String  result) {  // result is data returned by doInBackground
        Toast.makeText(context, result, Toast.LENGTH_LONG).show();
        mProgressDialog.dismiss();
        super.onPostExecute(result);
    }
   }

If you are using asynctask in separate class, then use AsyncTask with callback interface like this

这是我之前提供的关于相同 AsyncTask with Callback 的答案

关于android - 从 AsyncTask 返回数据而不阻塞 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15635436/

相关文章:

选项卡上的 Android 抽屉导航

android - 如何在Android Studio中显示ViewStub预览?

安卓异步任务

android - okhttp3 如何从异步 GET 调用返回值

android - 无法立即读取下载的文本文件

android - 如何在不安装barcodescanner app的情况下使用ZXing库

java - 为什么我的字符串到字符串比较失败?

java - 更新 SQLite 数据库中的行会创建重复行

android - 使用 Web 服务响应更新 ViewPager fragment

java.lang.ArrayIndexOutOfBoundsException 真的很奇怪