2012-08-16 103 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; 
    } 
} 

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