java - ProgressBar 在 AsyncTask 期间不显示

标签 java android android-asynctask progress-bar

我想在后台做一个简单的任务,并在完成时显示一个进度条。

这是主要(也是唯一) Activity 的代码:

public class Login extends Activity {

    public static ProgressDialog progressDialog;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        (...)
        this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
        this.getWindow().setFeatureInt(Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON);
        progressDialog = new ProgressDialog(activity); 
        progressDialog.setMessage("Sending data...");
        progressDialog.setCancelable(false);
        (...)
             // In some onClick Eevent..
             JSONObject result = new Urltasks().execute(...).get();
        (...)

    }
}

这是 Activity 的代码:

class Urltasks extends AsyncTask<String, Integer, JSONObject>{

    protected void onPreExecute()  {
        System.out.println("Inicia onPreExecute");
        Login.progressDialog.show();
    }

    protected void onPostExecute(String result) {
        Login.progressDialog.dismiss();
    }

    protected JSONObject doInBackground(String... arg0) {
             // Some work being done. I do not use Login.progressDialog here
    }
}

使用此代码,ProgressDialog 在任务结束时显示,并且不会关闭。

最佳答案

问题在这里:

JSONObject result = new Urltasks().execute(...).get();

AsyncTask 上调用 get() 会阻塞当前线程,即您的 UI 线程,直到执行 AsyncTask。因此进度对话框无法运行。删除 get()

要获取 AsyncTask 的结果,您可以例如将监听器回调传递给在结果可用时收到通知的异步任务:

class YourAsyncTask extends AsyncTask<ParamType, ProgressType, ResultType> {

  private YourResultListener mListener;

  interface YourResultListener {
    void onResultAvailable(ResultType result);
  }

  YourAsyncTask(YourResultListener listener) {
    mListener = listener;
  }

  @Override protected ResultType doInBackground(ParamType... params) {
    //...
  }

  @Override protected void onPostExecute(ResultType result) {
    mListener.onResultAvailable(result);
  }
}

你可以像这样使用它:

mProgressDialog.show();
new YourAsyncTask(new YourResultListener() {
    @Override void onResultAvailable(ResultType result) {
      mProgressDialog.dismiss();
      // use result
    }).execute(params);

就我个人而言,我喜欢将进度对话框等用户界面元素与异步任务分离。

关于java - ProgressBar 在 AsyncTask 期间不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17838618/

相关文章:

java - 如何实现 hashCode 和 equals 方法从 ArrayList 中删除重复项

Hudson/Jenkins 上的 Android Logcat 文件

android - 如何使用命令行生成apk文件?

android - 在 asynctask 中任务完成后显示进度对话框

java - 从 HashMap 中删除值在指定范围内的条目的有效方法

java - EAP 6.1 中的类加载问题 - JBoss 7.2/WAR 类看不到 EAR 类

android - picasso 加载在 AsyncTask 中生成的图像

Android audiorecord 实例失败

java - 列表<? extends Something > 生成而不是 List<Something>

java - 可编辑的 JTree 将树节点转换为字符串