与ProgressDialog有一些问题。不能让它出现

时间:2015-07-09 10:37:20

标签: android multithreading progressdialog

我在android中遇到了ProgressDialog的一些问题。我认为它会相对容易使用,但事实证明不然。基本上我在我的活动“RegistrationActivity”中有一个progreesdialog实例。我按下一个按钮,当按下此按钮时,通过显示progressdialog开始注册。这都是在UI线程上完成的。下面是我的代码,它调用我的presenter方法,该方法在我的模式中调用一个方法,因为Iam使用MVP。

@Override
public void registerUser() {

    progdialog = new ProgressDialog(this);
    progdialog.setMessage("Loading...");
    progdialog.show();

    rpresenter.relayRegisterUser(emailedtxt.getText().toString(),
            passedtxt.getText().toString(), phoneedtxt.getText().toString());

}

我的模型中设置了一个单独的线程。在模型Iam中,当前通过将线程休眠五秒并使用处理程序将值返回给UI线程来伪造注册过程。下面是我创建的runnable并传递给模型“RegisterModel”中的我的线程。

    private Runnable runnable = new Runnable() {
    @Override
    public void run() {

        //upload data to the server
                reghandler.post(new Runnable() {
                    @Override
                    public void run() {
                        progress = 50;
                        regpresenter.updateUIProgress(progress);
                        Log.d("prog updated by :!!", String.valueOf(progress));
                    }
                });


        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        reghandler.post(new Runnable() {
                            @Override
                            public void run() {
                                progress = 100;
                                regpresenter.updateUIProgress(progress);
                                Log.d("prog update 2 :!!", String.valueOf(progress));
                            }
                        });
        appstate.setRegistered(true);
    }
};

当我按下按钮时,我认为progressdialog会出现,因为它调用了registerUser()方法。但事实并非如此。 updateUIProgress(progress)给我的演示者打电话。这反过来调用我的活动/视图中的一个名为UpdateProgress()的方法。我的模型中的线程已经睡了5秒后,我回复了100的值。这种方法如下所示。

@Override
public void updateProgress(int progress) {

    Log.d("increment progactivity:", String.valueOf(progress));
    progdialog.incrementProgressBy(progress);

    if(progress == 100)
        hideProgress();
 }

在收到进度值100后,调用“hideProgress()”方法,如下所示。但由于progressdialog首先没有出现,所以它什么都不做。

private void hideProgress()
{
    Log.d("hide prog called", "hide prg called");
    progdialog.dismiss();

}

与progressdialog有关的一切都在UI线程上,所以我不太确定我在这里做错了什么。如果有人在那里可以帮助我id欣赏它。谢谢!

编辑:

忘了提我修好了这个问题!这是一个愚蠢的错误,但我在线程上使用.join()强制UI线程等待注册线程完成。因此我没有看到进步对话。哎呀!

2 个答案:

答案 0 :(得分:0)

最好使用AsyncTask

在其他情况下,您应该将UI更新发布到UIThread中。见that

答案 1 :(得分:0)

使用异步任务

尝试这样的事情......

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
    case progress_bar_type:
        pDialog = new ProgressDialog(this);
        pDialog.setMessage("Loading..");
        pDialog.setIndeterminate(false);
        pDialog.setMax(100);
        pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        pDialog.setCancelable(false);
        pDialog.show();
        return pDialog;
    default:
        return null;
    }
}

class UpdateProgressbar extends AsyncTask<Void, String, Void> {  

    // Show Progress Bar Dialog
    Context appContext = getApplicationContext();
    @SuppressWarnings("deprecation")
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        showDialog(progress_bar_type);

        publishProgress("0");

    }

    @Override
    protected Void doInBackground(Void... result) {

        try {       

            //your code
            //.........
            //.........


            publishProgress(""+(int)((count*100)/lenghtOfFile)); //update progress bar  

        } catch (Exception e) {
            Log.e("Error: ", e.getMessage());
        }

        return null;
    }

    // Update progress bar

   protected void onProgressUpdate(String... progress) {

        pDialog.setProgress(Integer.parseInt(progress[0]));

   }


     //Close the progress dialog

    @SuppressWarnings("deprecation")
    @Override
    protected void onPostExecute(Void result) {

        // dismiss the dialog
        dismissDialog(progress_bar_type);

    }

}