4

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

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

这是异步类:

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的原因。我试图找到一些答案,这是如何解决的——但没有成功。

如果有人遇到这种情况,请分享您的经验。多谢!

4

5 回答 5

1

尝试 :

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

让我知道这是否解决了问题,否则我会深入了解。

于 2012-08-16T15:59:22.200 回答
1

你的代码对我来说看起来不错。您对 Asynctask 的理解是正确的,并且您对它们的使用也似乎是正确的。我唯一能想到的就是你必须确保你也在 UI 线程上调用 execute()。从发布的代码中,我无法判断您所处的环境。

确保您可以将“this”作为上下文传递。这将告诉您是否在 UI 线程上。

ProgressDialog progressDialog = new ProgressDialog(this);
于 2012-08-16T16:00:32.850 回答
1

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

onPreExecute 和 onPostExecute 在主线程上调用,不会被在另一个线程上运行的 doInBackground 阻塞。onPreExecute 在 doInBackground 之前调用,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;
    }
}

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

于 2013-04-02T19:41:53.933 回答
1

也许你错过了上下文

ProgressDialog progressDialog = new ProgressDialog(this);
于 2012-08-16T16:12:48.880 回答
1

您将 ProgressDialog 传递给任务,只需在启动 AsyncTask 之前显示()它,而不是从 AsyncTask 中。

于 2012-08-16T15:58:10.473 回答