2012-07-02 7 views
1

Я использую AsyncTask при получении данных из веб-службы. Я хочу показать ProgressDialog, пока я получаю данные с веб-сервера. Ниже приведен фрагмент кода.ProgressDialog не отображается в AsyncTask

Я инициализировать окно выполнения и вызова объекта асинхронной задачи в OnCreate и вызовите AsyncTask:

public class MyDashboardActivity extends Activity { 
    ProgressDialog mProgressDialog; 
    static final int LOADING_DIALOG = 0; 

private FetchDashboardEntriesProcess mTask; 
private boolean mShownDialog; 
    private MyDashboardActivity act = null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.mydashboard); 
mTask = new FetchDashboardEntriesProcess(MyDashboardActivity.this); 
    mTask.execute(null,null,null); 
} 

private class FetchDashboardEntriesProcess extends AsyncTask<Object, Void, Void> { 

private MyDashboardActivity activity; 
private boolean completed; 



private ArrayList<DashboardEntry> returnVal = new ArrayList<DashboardEntry>(); 

private FetchDashboardEntriesProcess(MyDashboardActivity activity) { 
    this.activity = activity; 
} 

public ArrayList<DashboardEntry> getAllDashboardEntry() { 
    return returnVal; 
} 

@Override 
protected void onPreExecute() { 
    if (!completed) { 

     activity.showDialog(LOADING_DIALOG); 

    } 
} 

@Override 
protected Void doInBackground(Object... params) { 
    try { 
     ServiceCall call = new ServiceCall(); 
     DashboardEntryCriteria bean = new DashboardEntryCriteria(); 
     StringBuilder dateStr = new StringBuilder(); 

     bean.setLoginId("300"); 
     returnVal = call.getDashboardEntries(bean); 

    } catch (Exception e) { 
     Log.d(TAG, "Exception" + e.toString()); 
     e.printStackTrace(); 
    } 
    return null; 

} 

@Override 
protected void onPostExecute(Void unused) { 
    completed = true; 

    notifyActivityTaskCompleted(); 

} 

private void setActivity(MyDashboardActivity activity) { 
    this.activity = activity; 
    if (completed) { 
     notifyActivityTaskCompleted(); 
    } 
} 
private void notifyActivityTaskCompleted() { 
    if (null != activity) { 
     activity.onTaskCompleted(); 

    } 
} 
} 
private void onTaskCompleted() { 
    Log.e(TAG, "Activity " + this 
      + " has been notified the task is complete."); 
    dashboardEntries = mTask.getAllDashboardEntry(); 
    fillDashboardEntries(dashboardEntries); 

    if (mShownDialog) { 
     dismissDialog(LOADING_DIALOG); 

    } 
} 

@Override 
protected void onPrepareDialog(int id, Dialog dialog) { 
    super.onPrepareDialog(id, dialog); 
    if (id == LOADING_DIALOG) { 
     mShownDialog = true; 
    } 
} 

@Override 
protected Dialog onCreateDialog(int id) { 
    // TODO Auto-generated method stub 
    if (id == LOADING_DIALOG) { 
     mProgressDialog = Functions.getProgressDialog(act, 
       getString(R.string.all_retriving_data)); 
     return mProgressDialog; 
    } 
    return super.onCreateDialog(id); 
} 
} 

Согласно программе журнала прерывается на onPreExecute на линии activity.showDialog(LOADING_DIALOG); поэтому я предполагаю, что ошибка генерируется из-за что-то не так с тем, как я создаю диалог. Как мне пройти мимо этого?

спасибо.

EDIT: Log Cat

07-02 19:41:53.433: D/dalvikvm(335): GC_EXTERNAL_ALLOC freed 61K, 52% free 2600K/5379K, external 1625K/2137K, paused 79ms 

07-02 19:41:58.214: I/myproject(335): Activity [email protected] has been notified the task is complete. 
07-02 19:41:58.745: D/dalvikvm(335): GC_EXTERNAL_ALLOC freed 271K, 52% free 2721K/5639K, external 3579K/3826K, paused 152ms 

07-02 19:41:59.644: E/RESULT:(335): GetDashboardEntriesResponse{GetDashboardEntriesResult=anyType{}; } 

07-02 19:41:59.654: E/Some Exception(335): Some Exception 
07-02 19:41:59.664: W/System.err(335): java.lang.NullPointerException 
07-02 19:41:59.664: W/System.err(335):  at android.app.Dialog.<init> (Dialog.java:141) 
07-02 19:41:59.664: W/System.err(335): at android.app.AlertDialog.<init>(AlertDialog.java:63) 
07-02 19:41:59.674: W/System.err(335): at android.app.ProgressDialog.<init>(ProgressDialog.java:80) 
07-02 19:41:59.674: W/System.err(335): at android.app.ProgressDialog.<init>(ProgressDialog.java:76) 
07-02 19:41:59.674: W/System.err(335): at com.myproject.utils.Functions.getProgressDialog(Functions.java:54) 
07-02 19:41:59.674: W/System.err(335): at com.myproject.activities.MyDashboardActivity.onCreateDialog(MyDashboardActivity.java:178) 
07-02 19:41:59.674: W/System.err(335): at android.app.Activity.onCreateDialog(Activity.java:2482) 
07-02 19:41:59.674: W/System.err(335): at android.app.Activity.createDialog(Activity.java:882) 
07-02 19:41:59.674: W/System.err(335): at android.app.Activity.showDialog(Activity.java:2557) 
07-02 19:41:59.674: W/System.err(335): at android.app.Activity.showDialog(Activity.java:2524) 
07-02 19:41:59.674: W/System.err(335): at com.myproject.activities.MyDashboardActivity$FetchDashboardEntriesProcess.onPreExecute(MyDashboardActivity.java:211) 
07-02 19:41:59.674: W/System.err(335): at android.os.AsyncTask.execute(AsyncTask.java:391) 
07-02 19:41:59.674: W/System.err(335): at com.myproject.activities.MyDashboardActivity.onCreate(MyDashboardActivity.java:159) 
07-02 19:41:59.674: W/System.err(335): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
07-02 19:41:59.684: W/System.err(335): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
07-02 19:41:59.684: W/System.err(335): at android.app.ActivityThread.startActivityNow(ActivityThread.java:1487) 
07-02 19:41:59.684: W/System.err(335): at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127) 
07-02 19:41:59.684: W/System.err(335): at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339) 
07-02 19:41:59.684: W/System.err(335): at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:654) 
07-02 19:41:59.684: W/System.err(335): at android.widget.TabHost.setCurrentTab(TabHost.java:326) 
07-02 19:41:59.684: W/System.err(335): at android.widget.TabHost.addTab(TabHost.java:216) 
07-02 19:41:59.684: W/System.err(335): at com.myproject.activities.IncludeTabActivity.onCreate(IncludeTabActivity.java:52) 
07-02 19:41:59.684: W/System.err(335): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
07-02 19:41:59.684: W/System.err(335): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
07-02 19:41:59.684: W/System.err(335): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
07-02 19:41:59.694: W/System.err(335): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
07-02 19:41:59.694: W/System.err(335): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
07-02 19:41:59.694: W/System.err(335): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-02 19:41:59.694: W/System.err(335): at android.os.Looper.loop(Looper.java:123) 
07-02 19:41:59.694: W/System.err(335): at android.app.ActivityThread.main(ActivityThread.java:3683) 
07-02 19:41:59.694: W/System.err(335): at java.lang.reflect.Method.invokeNative(Native Method) 
07-02 19:41:59.704: W/System.err(335): at java.lang.reflect.Method.invoke(Method.java:507) 
07-02 19:41:59.704: W/System.err(335): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
07-02 19:41:59.704: W/System.err(335): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
07-02 19:41:59.704: W/System.err(335): at dalvik.system.NativeStart.main(Native Method) 
+0

Не могли бы вы опубликовать LogCat? –

+0

Я отправил логарифм. Пожалуйста, посмотрите – Harsh

+1

Не создавайте диалоговое окно в 'com.myproject.utils.Functions', следуйте указаниям [официального руководства для разработчиков] (http://developer.android.com/guide/topics/ui/dialogs.html#ShowingADialog) предложите: диалог _A всегда создается и отображается как часть Activity. Обычно вы должны создавать диалоги из метода обратного вызова onCreateDialog (int) вашего действия. – yorkw

ответ

1

Для меня это выглядит как переменная act всегда null.

Ассинг активностью act или попробовать это:

mProgressDialog = Functions.getProgressDialog(MyDashboardActivity.this, 
       getString(R.string.all_retriving_data)); 
1

Вместо пропускании Activity в к AsyncTask, просто создать метод внутри деятельности называется showDialog() и затем вызвать этот от onPreExecute() и onPostExecute(). Создайте и покажите ProgressDialog. Поскольку вы создали AsyncTask как внутренний класс, он должен иметь возможность вызвать метод в Activity без проблем, и вам не нужно беспокоиться о переходе в Context.

Подобно AsyncTask разработчиков страницы, например: http://developer.android.com/reference/android/os/AsyncTask.html

+0

На самом деле, я использовал этот подход некоторое время. У меня есть несколько других экранов, имеющих похожие методы, поэтому мне было интересно, не могли бы вы помочь мне определить проблему. Я также разместил logcat. – Harsh

+0

Ну, это дает вам NPE для этой линии. Я бы поставил точку останова на линии, а затем проверил вход в нее. В строке с 'mProgressDialog = Functions.getProgressDialog (act, getString (R.string.all_retriving_data));' что 'act'? Я не вижу его нигде. –

+0

это пример активности. Я обновил его. Простите за это – Harsh

Смежные вопросы