AsyncTask没有显示ProgressDialog

时间:2012-08-16 15:54:21

标签: android android-asynctask progressdialog

我正在使用AsyncTask(我在我的主要活动中开始)来加载一些数据:

Context context = VehicleTabView.this;
ProgressDialog progressDialog = new ProgressDialog(context);
progressDialog.setMessage("Loading...");
new LoadingVehicles(context, progressDialog).execute(null, null, null);

这是AsyncClass:

package com.example.schedule_vehicles;

import com.example.utils.VehicleNames;

import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;

    // Showing a ProgressDialog once loading the list of vehicles is completed using an AsyncTask
    public class LoadingVehicles extends AsyncTask<Void, Void, Void> {
    Context context;
    ProgressDialog progressDialog;

    public LoadingVehicles(Context context, ProgressDialog progressDialog) {
        this.context = context;
        this.progressDialog = progressDialog;
    }

    @Override
    protected void onPreExecute() {
        progressDialog.show();
    }

    @Override
    protected Void doInBackground(Void... params) {
        new VehicleNames(context);

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        progressDialog.dismiss();
    }
}

ProgressDialog未在屏幕上显示的问题。

我输入Log.d,看看程序是否经历了所有阶段 - onPreExecute,doInBackground,onPostExecute,它正在经历所有阶段并完成我需要的工作。 ProgressDialog未显示。我读了很多关于这个东西的信息,似乎PRE和POST执行是由主线程启动的,它被DOINBACKGROUND方法阻塞,这就是没有看到ProgressDialog的原因。我试图找到一些答案如何解决 - 但没有成功。

如果有人遇到此问题,请分享您的经验。非常感谢!

5 个答案:

答案 0 :(得分:1)

您正在将ProgressDialog传递给Task,只是在启动AsyncTask之前show()它,而不是从AsyncTask中传递。

答案 1 :(得分:1)

尝试:

ProgressDialog progressDialog = new ProgressDialog([Activity Name].this);

如果这可以解决问题或者我会深入了解,请告诉我。

答案 2 :(得分:1)

您的代码对我来说很好。你对Asynctask的理解是正确的,你对它们的使用也是正确的。 我唯一能想到的是你必须确保你也在UI线程上调用execute()。从发布的代码中我无法说出你所处的背景。

确保你可以传入&#34;这个&#34;作为一个背景。这将告诉你你是否在UI线程上。

ProgressDialog progressDialog = new ProgressDialog(this);

答案 3 :(得分:1)

也许您错过了上下文

ProgressDialog progressDialog = new ProgressDialog(this);

答案 4 :(得分:1)

通常在创建ProgressDialog时,使用静态方法ProgressDialog.show(context,title,message)。这将创建并显示消息,并返回对对话框的引用。

onPreExecute和onPostExecute在主线程上调用,并且不会被在另一个线程上运行的doInBackground阻止。在doInBackground之前调用onPreExecute,在之后调用onPostExecute。

以下是一些示例代码:

public static class InitializeTask extends MyAsyncTask<String, String, Response<Object>> {

    private Activity activity;
    private ProgressDialog dialog;

    public InitializeTask(Activity activity) {
        this.activity = activity;
    }

    @Override
    protected void onPreExecute() {
        dialog = ProgressDialog.show(activity, null, "Initializing...");
    }

    @Override
    protected void onPostExecute(Response<Object> result) {
            if (dialog != null && dialog.isShowing())
                dialog.dismiss();
    }

    @Override
    protected Response<Object> doInBackground(String... params) {

    }

    @Override
    protected void attach(Activity context) {
        this.activity = context;
        dialog = ProgressDialog.show(context, null, "Initialize...");
    }

    @Override
    protected void detach() {
        if (dialog.isShowing())
            dialog.dismiss();
        activity = null;
    }
}

附加和分离是我自己引用交叉方向更改的方法。