簡體   English   中英

通過應用程序顯示ProgressDialogs的最佳實踐?

[英]Best practice to show ProgressDialogs through an application?

在我的應用程序中,我想顯示某些事件的ProgressDialog (例如在AsyncTasks期間)。 我從不希望同時顯示多個ProgressDialogs

最佳和最有效的方法是什么? 我當前的代碼如下所示:

public class ProgressDialogHelper {
    private static ProgressDialog progressDialog;

    public static void showProgressDialog(Context c) {
        if (progressDialog == null) {
            progressDialog = ProgressDialog.show(c, null, null);
            progressDialog.setContentView(R.layout.progress_bar);
        }
    }

    public static void dismissProgressDialog() {
        if (progressDialog != null) {
            progressDialog.dismiss();
            progressDialog = null;
        }
    }
}

我正在從其他類中調用這些方法以顯示/關閉ProgressDialog

這被認為是好的做法嗎? 如果沒有,我應該怎么做?

您正在尋求最佳實踐。 實際上,最佳實踐是不使用ProgressDialog ,因為它們會阻止用戶與應用程序進行交互。

有許多不使用ProgressDialog

如果您的應用正在加載列表所需的數據,請放置一個Spinner而不是ListView。

有關此主題的其他更多信息,請參見此處: Google設計指南:進度


如果您仍然想使用ProgressDialog我強烈建議您不要使用上面發布的類。 它擁有對progressDialogstatic引用,因此它是所有活動和活動周期之上的全局引用。 如果您的應用程序被重新創建或其他原因,可能會導致一些麻煩。

我建議您使用一個非static ProgressDialogHelper您可以為每個Activity初始化,然后將處理該Dialog 還要確保處理諸如onDestroy生命周期方法


可以使用@jagmohan指出的BaseActivity,但是如果您不想擁有自己的BaseActivity並希望使用某些東西作為插入對象,則可以創建以下內容:

ProgressDialogHelper.java

public class ProgressDialogHelper {
    ProgressDialog mProgressDialog;

    public ProgressDialogHelper() {

    }

    public ProgressDialogHelper(Context context, String title, String message) {
        mProgressDialog = new ProgressDialog(context);
        mProgressDialog.setTitle(title);
        mProgressDialog.setMessage(message);
        mProgressDialog.show();
    }

    public ProgressDialog getProgressDialog() {
        return mProgressDialog;
    }

    public void setProgressDialog(ProgressDialog mProgressDialog) {
        //make sure the previous dialog is hidden
        hide();
        this.mProgressDialog = mProgressDialog;
    }

    public void show() {
        if (mProgressDialog != null && !mProgressDialog.isShowing()) {
            mProgressDialog.show();
        }
    }

    public void create(Context context, String title, String message) {
        if (mProgressDialog != null) {
            mProgressDialog.dismiss();
        }
        mProgressDialog = ProgressDialog.show(context, title, message);
    }

    public void hide() {
        if (mProgressDialog != null && mProgressDialog.isShowing()) {
            mProgressDialog.dismiss();
            mProgressDialog = null;
        }
    }

    public void onDestroy() {
        hide();
    }
}

正如@mikepenz指出的那樣,在最新的設計指南中不建議使用ProgressDialogs。 但是,這在過去對我來說很有效。

我曾經設置一個基本的Activity並添加了一些方法來隱藏和顯示該類中的進度對話框。

public class BaseActivity extends ActionBarActivity {

    protected static final String TAG = BaseActivity.class.getSimpleName();
    protected ProgressDialog mProgressDialog;

    protected void showProgressDialog(String title, String message) {
        if (mProgressDialog != null) {
            mProgressDialog.dismiss();
        }
        mProgressDialog = ProgressDialog.show(this, title, message);
    }

    protected void hideProgressDialog() {
        if (mProgressDialog != null && mProgressDialog.isShowing()) {
            mProgressDialog.dismiss();
            mProgressDialog = null;
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        // hide progress dialog to prevent leaks
        hideProgressDialog();
    }

    // other stuff...
}

現在,您可以在您在項目中創建的新活動類中擴展此基礎活動,並使用這些方法顯示/隱藏進度對話框。

順便說一句,只要確保您從UI線程調用show / hide方法即可。

希望這能回答您的問題。

暫無
暫無

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

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