AsyncTask没有显示ProgressDialog。

4

我正在使用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的原因。我尝试寻找一些解决方案,但没有成功。如果有人遇到过这个问题,请分享您的经验。非常感谢!

程序是否进入了'onPreExecute()'循环?如果没有,请尝试使用super.onPreExecute(),这可能会有所帮助。 - monish_sc
5个回答

1
你正在将ProgressDialog传递给Task,只需在启动AsyncTask之前显示它,而不是在AsyncTask内部显示。

这应该不重要。onPreExecute() 应该在 UI 线程上运行。如果他只是这样做,那么他的问题就不会是它没有关闭。 - Frank Sposaro
无论我在哪里启动ProgressDialog - 在这两种情况下,主线程都会处理 - 结果是相同的 - 没有显示进度对话框... - zanio

1
通常创建ProgressDialog时,使用静态方法ProgressDialog.show(context, title, message)。这将创建并显示消息,并返回对话框的引用。
onPreExecute和onPostExecute在主线程上调用,并且不会被doInBackground阻塞,而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;
    }
}

Attach和detach是我自己为引用跨方向更改而创建的方法。


1

请尝试:

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

请告诉我这是否解决了问题,否则我会深入研究。


我使用的上下文变量正是你上面写的 - 感谢提示,但这并不是情况。 - zanio

1

你的代码对我来说看起来不错。你对Asynctask的理解是正确的,你使用它们的方式也似乎正确。

我能想到的唯一一件事就是确保你在UI线程上调用execute()。从发布的代码中,我无法确定你所处的上下文。

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

ProgressDialog progressDialog = new ProgressDialog(this);

ProgressDialog是这样创建的: Context context = VehicleTabView.this; ProgressDialog progressDialog = new ProgressDialog(context); 其中context是主活动的上下文,即UI线程。之后我只是创建了一个异步类的新对象并执行。请问如何确保它在UI线程上? - zanio
我看到你正在创建上下文,这在你的代码中有体现。我不知道VehicleTabView是什么。我给出了一个检查确保你在UI线程上运行的代码示例。显然你没有尝试它…… - Frank Sposaro
1
嗨,弗兰克,我明白你的意思,但是在我看来,使用以下代码和仅使用以下代码之间没有区别: Context context = VehicleTabView.this; ProgressDialog progressDialog = new ProgressDialog(context);ProgressDialog progressDialog = new ProgressDialog(this);对我来说,它们完全相同。如果我错了,请告诉我为什么:) - 我真的很困惑。 - zanio
我正在尝试简化问题。你确定这些上下文是相同的吗?除此之外,从这里看起来一切都没问题。也许你可以附加更多的源代码,因为我们在定位问题时遇到了困难。 - Frank Sposaro

1
也许你缺少了上下文。
ProgressDialog progressDialog = new ProgressDialog(this);

正如我在上面写的那样 - 我正在使用CONTEXT来设置对话框。 CONTEXT变量是来自主活动的变量,因此这不是问题。 - zanio
@ЗдравкоНесторов:你解决了问题吗?如果是的话,请友好地分享解决方案。 :) - Swayam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接