簡體   English   中英

AsyncTask進度對話框問題

[英]AsyncTask progress dialog issue

我有一個自定義的AsyncTask類,我想將其用於GCM注冊以及在“我的服務器”上的注冊。 注冊是可以的,因為可以。 但是,如果我在AsyncTask中創建,則在注冊仍在進行時無法顯示進度對話框。 任務開始后,進度對話框消失。 但是,我只想在GCM注冊完成,我的服務器注冊完成並將一些數據上傳到服務器后關閉它。 可能有人可以幫助我使這一切正常。 也許有人可以向我展示一些更適合這種情況的變體。 GCM類和注冊方法取自gcm android示例。

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.");
        }
    }

}

很簡單,在GCMIntentService.onRegistered()方法中設置一個static booleantrue ,然后在AsyncTask's onPostExecute()方法中檢查此布爾變量值。 如果false重復GCM注冊過程,否則關閉進度對話框。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM