2012-08-16 107 views
3

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

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

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

+0

程序是否进入'onPreExecute()'循环,如果不尝试使用super.onPreExecute(),它可能会有所帮助。 – 2012-08-17 11:49:51

回答

1

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

+0

这应该没关系。 onPreExecute()假设在UI线程上运行。如果他只是这样做,那么他的问题不会是它不会关闭。 – 2012-08-16 16:02:24

+0

它不梅特在那里我开始ProgressDialog - 在这两种情况下,主线程照顾这一点 - 其结果是一样的 - 没有进展对话框显示... – zanio 2012-08-16 19:20:57

1

尝试:

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

让我知道,如果这个问题解决了,不然我就深入看到。

+0

这是我使用的上下文变量究竟是你上面写道 - 谢谢你的提示,但这不是这种情况:( – zanio 2012-08-16 19:21:28

1

你的代码对我来说很不错。你对你对Asynctask的理解是正确的,你对它们的使用也是正确的。 我能想到的唯一的事情就是你必须确保你在UI Thread上调用了execute()。从发布的代码中,我无法确定您所处的环境。

确保您可以传入“this”作为上下文。这将告诉你,如果你在UI线程或不。

ProgressDialog progressDialog = new ProgressDialog(this); 
+0

ProgressDialog创建于: 上下文context = VehicleTabView.this; ProgressDialog progressDialog = new ProgressDialog(context); 上下文是上下文主要的活动,所以UI线程。之后,我只是创建一个新的对象的异步类和执行。请你让我知道如何确保它在UI线程? – zanio 2012-08-16 19:22:19

+0

我看你是如何创建上下文,你在代码中有这个,我不知道VehicleTabView是什么,我给出了一个代码示例来说明如何检查确保你在UI线程上运行。显然,你没有尝试....... – 2012-08-16 19:33:04

+1

嗨弗兰克, 我看你指点什么,但根据我有使用没有任何区别: 上下文的背景下= VehicleTabView.this; ProgressDialog progressDialog = new ProgressDialog(context); 并且只有这个: ProgressDialog progressDialog = new ProgressDialog(this); 对我来说他们是完全一样的。如果我错了,请让我知道为什么:) - 我真的很困惑。 – zanio 2012-08-17 07:44:37

1

也许你缺少背景

ProgressDialog progressDialog = new ProgressDialog(this); 
+0

正如我上面写的 - 我使用CONTEXT来设置对话框。 CONTEXT变量是主要活动中的变量,所以这不是问题。 – zanio 2012-08-16 19:20:09

+0

@ЗдравкоНесторов:你解决了你的问题吗?如果是的话,请分享解决方案。 :) – Swayam 2013-03-31 13:07:51

1

通常创建ProgressDialog时,您可以使用静态方法ProgressDialog.show(背景下,标题,消息)。这将创建并显示消息,并返回对该对话框的引用。

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

下面是一些示例代码:

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; 
    } 
} 

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