了解ProgressDialog的工作原理

时间:2019-07-17 05:32:08

标签: android progressdialog

我使用带有修订API 23的设备,并且因为我认为使用ProgressDialog会很容易,因为它仍然可用。

我试图启动一个需要做大量工作的线程,而在他执行此操作时,用户必须等待。

在使用ProgressDialog时遇到其他问题:

1。不停止

public void buttun(View view) {

        ProgressDialog mProgressDialog = new ProgressDialog(this);
        mProgressDialog.show(this,"Title","Message",true);
        addCustomQueue.start();
        getCustomQueue.start();
        mProgressDialog.dismiss();
}

在这种情况下,单击按钮将显示ProgressDialog,但是.dismiss()不起作用。 (我知道即使线程未完成,ProgessDialog也应立即关闭。我只是想知道.dismiss()是否有效。)

2。要在MainThread上做很多工作

public void buttun(View view) {

        ProgressDialog mProgressDialog = new ProgressDialog(this);
        mProgressDialog.show(this,"Title","Message",true);
        addCustomQueue.start();
        getCustomQueue.start();

        try {
            addCustomQueue.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        mProgressDialog.dismiss();
    }

当我尝试{肯定会在20秒后结束的”一个线程时,ProgressDialog将在大约30秒后显示,并且.join()也将不起作用。但是我得到了有关线程完成的信息。

我要使用的样式是第二个样式,但是我需要一种适当的方式来实现。 正确的用法是什么?

4 个答案:

答案 0 :(得分:1)

您正在创建两个Progressdialog对象。

//Instead of 
//ProgressDialog mProgressDialog = new ProgressDialog(this);
//mProgressDialog.show(this,"Title","Message",true);

//use
ProgressDialog mProgressDialog = ProgressDialog.show(this,"Title","Message",true);

//Now, you'll be able to dismiss it
mProgressDialog.dismiss();

这不是最直观的方法,但是静态show(..)方法会创建并显示进度对话框。 (Reference

  

static ProgressDialog show(Context context, CharSequence title, CharSequence message, boolean indeterminate)

     

创建并显示一个ProgressDialog。

P.S-Reyhane的答案也应该起作用,因为show()方法是一种对象级方法,它直接显示对话框而不是创建对话框并显示。 (Reference

答案 1 :(得分:1)

1。不停止

实际上,ProgressDialog.show(Context, String, String, boolean)是一个静态方法,它创建一个新的ProgressDialog并在显示它之后将其返回。

您应该像这样更改代码。

ProgressDialog mProgressDialog = ProgressDialog.show(this,"Title","Message",true);
mProgressDialog.dismiss();

2。 MainThread上的工作太多

您应该从不禁止阻塞Android的MainThread,因此在MainThread上加入线程不是一个好主意。

您可以使用Handler在MainThread上发布回调,而不是在MainThread上加入长时间运行的线程。

您的活动:

public class MainActivity extends AppCompatActivity {

    private ProgressDialog mProgressDialog;
    private AddCustomQueueThread addCustomQueue;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        addCustomQueue = new AddCustomQueueThread(this);
    }

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

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(mProgressDialog != null) {
            mProgressDialog.dismiss();
            mProgressDialog = null;
        }
    }

    public void button(View view) {
        addCustomQueue.start();
        mProgressDialog = ProgressDialog.show(this,"Title","Message",true);
    }
}

您的主题:


    class AddCustomQueueThread extends Thread {
        final WeakReference<MainActivity> activity;
        final Handler handler;
        AddCustomQueueThread(MainActivity act) {
            activity = new WeakReference<>(act);
            handler = new Handler(Looper.getMainLooper());
        }

        @Override
        public void run() {
            super.run();

            //do your work.

            handler.post(new Runnable() {
                @Override
                public void run() {
                    MainActivity act = activity.get();
                    if(act != null) {
                        act.dismissProgressDialog();
                    }
                }
            });

        }
    }

请注意:我们将对活动的引用存储在WeakReference内,这是防止您的活动泄漏所必需的。

答案 2 :(得分:0)

 new Thread(new Runnable() {
        @Override
        public void run() {
            //  Here you can do your background task for processing data that may take seconds
            addCustomQueue.start();
            getCustomQueue.start();
            try {
                addCustomQueue.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            // Here you can put code for UI changes that display on screen
            if (mProgressDialog.isShowing()) {
                mProgressDialog.dismiss();
            }
        }
    });

您可以通过适当的多重处理性能来管理它,在这里,我仅向您提供示例,因为我不知道您的功能和代码。

答案 3 :(得分:0)

在开始工作之前,您应该编写以下代码:

final ProgressDialog pd = new ProgressDialog(this);
            pd.setMessage("Processing...");
            pd.setCancelable(false);
            pd.show();

,在结束工作后写成这样: pd.cancel();