【问题标题】:AsyncTask not showing the ProgressDialogAsyncTask 不显示 ProgressDialog
【发布时间】:2012-08-13 00:47:50
【问题描述】:

我正在使用 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(),它可能会有所帮助。

标签: android android-asynctask progressdialog


【解决方案1】:

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

【讨论】:

  • 这应该没关系。 onPreExecute() 假设在 UI 线程上运行。如果他只是这样做,那么他的问题就不会是它没有关闭。
  • 我在哪里启动 ProgressDialog 并不重要 - 在这两种情况下,主线程都在处理这个问题 - 结果是一样的 - 没有显示进度对话框......
【解决方案2】:

试试:

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

如果这能解决问题,请告诉我,否则我会深入了解。

【讨论】:

  • 我使用的上下文变量正是您在上面写的 - 感谢您的提示,但事实并非如此:(
【解决方案3】:

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

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

ProgressDialog progressDialog = new ProgressDialog(this);

【讨论】:

  • ProgressDialog 是通过以下方式创建的:Context context = VehicleTabView.this; ProgressDialog progressDialog = new ProgressDialog(context); wrere上下文是主activity的上下文,所以是UI线程。之后,我只是创建异步类的新对象并执行。请告诉我如何确保它在 UI 线程上?
  • 我看到了你如何创建上下文,你的代码中有它。我不知道 VehicleTabView 是什么。我给出了一个关于如何检查以确保您在 UI 线程上运行的代码示例。显然你没有尝试过.......
  • 嗨弗兰克,我明白你指的是什么,但根据我的说法,使用没有区别:上下文上下文 = VehicleTabView.this; ProgressDialog progressDialog = new ProgressDialog(context);只有这个: ProgressDialog progressDialog = new ProgressDialog(this);对我来说,它们完全一样。如果我错了,请告诉我为什么:) - 我真的很困惑。
  • 我正在尝试简化问题。你确定那些上下文是一样的吗?从这里看,除此之外的一切都很好。也许你会从附加更多源代码中受益,因为我们在定位问题时遇到了问题。
【解决方案4】:

也许你错过了上下文

ProgressDialog progressDialog = new ProgressDialog(this);

【讨论】:

  • 正如我上面所写的 - 我正在使用 CONTEXT 设置对话框。 CONTEXT 变量是来自主要活动的变量,所以这不是问题。
  • @ЗдравкоНесторов:你的问题解决了吗?如果是,请分享解决方案。 :)
【解决方案5】:

通常在创建 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;
    }
}

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

【讨论】:

    猜你喜欢
    • 2014-07-25
    • 1970-01-01
    • 2018-05-17
    • 2012-08-13
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多