2013-05-15 54 views
0

我有一個自定義的AsyncTask類,我想用它在我的服務器上進行GCM註冊和註冊。註冊,因爲它是工作很好。但是,如果我在AsyncTask中創建它,那麼當註冊仍在進行中時,我無法顯示進度對話框。進度對話框在任務開始後消失。但是隻有在GCM註冊完成後,我才能關閉它,我的服務器註冊完成並將一些數據上傳到服務器。可能有人可以幫助我完成所有工作。或者也許有人可以向我展示一些更適合這種情況的變體。 GCM類和註冊方法取自gcm android示例。AsyncTask進度對話框問題

My AsyncTask class code(just for screen rotation): 

public abstract class GNCustomAsyncTask<TParams, TProgress, TResult> extends AsyncTask<TParams, TProgress, TResult> { 
protected GNCommunityApplication mApp; 
protected Activity mActivity; 

public GNCustomAsyncTask(Activity activity) { 
    mActivity = activity; 
    mApp = (GNCommunityApplication) mActivity.getApplication(); 
} 

public void setActivity(Activity activity) { 
    mActivity = activity; 
    if (mActivity == null) { 
     onActivityDetached(); 
    } else { 
     onActivityAttached(); 
    } 
} 

protected void onActivityAttached() {} 

protected void onActivityDetached() {} 

@Override 
protected void onPreExecute() { 
    mApp.addTask(mActivity, this); 
} 

@Override 
protected void onPostExecute(TResult result) { 
    mApp.removeTask(this); 
} 

@Override 
protected void onCancelled() { 
    mApp.removeTask(this); 
} 
} 

註冊短代碼:

private static void checkRegistration(final Context context) { 
    final String gid = GCMRegistrar.getRegistrationId(context); 
    final Integer sid = CommonUtils.getSid(context); 

    if (gid.equals("")) { 
     // Automatically registers application on startup. 
     GCMRegistrar.register(context, SENDER_ID); 
    } else { 
     // Device is already registered on GCM 
     if (sid == null) { 
      ServerUtils.register(context, gid, CommonUtils.getImsi(context)); 
     } 
    } 
} 

我的AsyncTask:

private static class GetRegistrationIDTask extends GNCustomAsyncTask<Object, Integer, Integer> { 

    private static final String TAG = "DoBackgroundTask"; 

    private ProgressDialog mProgress; 
    private int mCurrProgress; 
    private RegistrationActivity activity; 

    public GetRegistrationIDTask(RegistrationActivity activity) { 
     super(activity); 
     this.activity = activity; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     showProgressDialog(); 
    } 

    @Override 
    protected void onActivityDetached() { 
     if (mProgress != null) { 
      mProgress.dismiss(); 
      mProgress = null; 
     } 
    } 

    @Override 
    protected void onActivityAttached() { 
     showProgressDialog(); 
    } 

    private void showProgressDialog() { 
     mProgress = new ProgressDialog(mActivity); 
     mProgress.setMessage("Registering..."); 
     mProgress.setCancelable(false); 
     mProgress.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     mProgress.show(); 
     mProgress.setProgress(mCurrProgress); 
    } 

    @Override 
    protected Integer doInBackground(Object... params) { 
     checkRegistration(activity); 
     Integer sid = CommonUtils.getSid(activity); 
     return sid; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... progress) { 
     mCurrProgress = progress[0]; 
     if (mActivity != null) { 
      mProgress.setProgress(mCurrProgress); 
     } 
     else { 
      Log.d(TAG, "Progress updated while no Activity was attached."); 
     } 
    } 

    @Override 
    protected void onPostExecute(Integer sid) { 
     super.onPostExecute(null); 
     if (mActivity != null) { 
      Toast.makeText(activity, "SID: " + sid, Toast.LENGTH_LONG).show(); 
      mProgress.dismiss(); 
      GCMRegistrar.unregister(activity); 
     } else { 
      Log.d(TAG, "AsyncTask finished while no Activity was attached."); 
     } 
    } 

} 

回答

0

簡單,GCMIntentService.onRegistered()方法設置一個static booleantrueAsyncTask's onPostExecute()方法來檢查這個布爾變量的值。如果是false,則重複GCM註冊過程,否則關閉進度對話框。

+0

你的意思是「重複GCM註冊過程」?再次調用註冊註冊? – SerijVeter

+0

是的,如果你想得到積極的結果。 –

+0

所以android gcm例子不是很實用,我需要完全重寫它。由於此示例最多使用5次嘗試在服務器上註冊(而不是gcm)。如果我正確地遵循你的邏輯,我必須記住每一個註冊步驟,以防止所有不必要的呼叫和解除對話,只有這樣才能成功完成。 Tnx,徵求意見。 – SerijVeter