【问题标题】:Android : How can I pause the main thread till AsyncTask completes?Android:如何暂停主线程直到 AsyncTask 完成?
【发布时间】:2016-06-16 11:59:25
【问题描述】:

我正在从我的 Android 应用程序的主线程调用一个异步任务。但是,我需要暂停主线程,直到异步任务结束。 有人可以建议如何做到这一点吗?

编辑:我需要使用 AsyncTask,因为我无法在主线程上执行网络请求

【问题讨论】:

  • 如果你想这样做,那你为什么要使用AsyncTaskAsyncTask 的要点是在做一些工作时不要暂停主线程。也去了你想这样做吗?您应该避免暂停主线程。
  • 这是一个网络请求
  • 你的回答有点奇怪,你想从主线程启动一个 AsyncTask 然后停止主线程。那么为什么要开始另一个线程呢?
  • 为什么要在执行网络请求时阻塞主线程?
  • 暂停主线程是一件坏事,因为它可能会使用户对正在发生的事情感到困惑。而是添加一个进度对话框,让用户知道正在发生的事情。

标签: android android-asynctask


【解决方案1】:

只需添加进度对话框。

ProgressDialog progress = new ProgressDialog(this);
progress.setMessage("please wait ");

显示它来自

    onPreExecute(){
      progress.show();
    }

解雇

onPostExecute(){
   progress.dismiss(); 
 }

【讨论】:

  • 这不会停止主线程,这会锁定屏幕上的用户交互。也许这个问题很糟糕,这才是真正的答案
  • 实际上停止主线程是不允许用户做任何事情
【解决方案2】:

一种方法是在 AsyncTask 执行之前显示一个对话框,然后在 postExecute() 中关闭该对话框

 public class MyAsyncTask extends AsyncTask<Void, Void, Void> {

        ProgressDialog dialog;



        @Override
        protected void onPreExecute() {
            super.onPreExecute();
 dialog = new ProgressDialog(UserMessages.this);
            dialog.setIndeterminate(true);
            dialog.setMessage("Please Wait...");
            dialog.setTitle("Loading Messages");
            dialog.setCancelable(true);
            dialog.show();
        }

        @Override
        protected Void doInBackground(Void... params) {

                     // Do your work

            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
 dialog.dismiss();
        }


        }

【讨论】:

    【解决方案3】:

    你不能暂停主线程,但你可以等到 AsyncTask 完成并使用生成它的结果

    AsyncTask.get()
    

    此方法将获取您在 DoInBackground() 中返回的结果,一旦任务完成,它将执行进一步的代码

    例如,如果您返回字符串,然后像这样编写您的方法,

    String result=AsyncTask.get();
    

    【讨论】:

      【解决方案4】:

      您可以在 Android 中使用 volley 库而不是异步任务来发出网络请求。它创建了一个线程池并减少了主线程的负载。 https://developer.android.com/training/volley/index.html

      【讨论】:

      • 鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。来自How to Answer
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 1970-01-01
      相关资源
      最近更新 更多