Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ProgressDialog有一些问题。我看不出来_Android_Multithreading_Progressdialog - Fatal编程技术网

Android ProgressDialog有一些问题。我看不出来

Android ProgressDialog有一些问题。我看不出来,android,multithreading,progressdialog,Android,Multithreading,Progressdialog,我对android中的ProgressDialog有一些问题。我原以为它会相对容易使用,但事实证明不是这样,哈哈。基本上,我的活动“RegistrationActivity”中有一个progreesdialog实例。我按下一个按钮,当按下这个按钮时,通过显示一个progressdialog开始注册。这一切都是在UI线程上完成的。下面是我调用presenter方法的代码,presenter方法在我的模式下调用一个方法,如Iam使用MVP @Override public void register

我对android中的ProgressDialog有一些问题。我原以为它会相对容易使用,但事实证明不是这样,哈哈。基本上,我的活动“RegistrationActivity”中有一个progreesdialog实例。我按下一个按钮,当按下这个按钮时,通过显示一个progressdialog开始注册。这一切都是在UI线程上完成的。下面是我调用presenter方法的代码,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线程来伪造注册过程。下面是我在模型“RegisterModel”中创建并传递给线程的可运行文件

当我按下按钮时,我假设progressdialog将在调用registerUser()方法时出现。但事实并非如此。UpdateUprogress(进度)呼叫我的演示者。这反过来调用我的活动/视图中名为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线程上,因此我不太确定我在这里做错了什么。如果有人能帮我,我会很感激的。谢谢

编辑:

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

最好使用

在另一种情况下,您应该将UI更新发布到UIThread中。请参见使用异步任务

试试这样的

@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);

    }

}
@覆盖
受保护的对话框onCreateDialog(int id){
开关(id){
案例进度条类型:
pDialog=新建进度对话框(此对话框);
pDialog.setMessage(“加载…”);
pDialog.setUndeterminate(假);
pDialog.setMax(100);
pDialog.setProgressStyle(ProgressDialog.STYLE_水平);
pDialog.setCancelable(假);
pDialog.show();
返回pDialog;
违约:
返回null;
}
}
类UpdateProgressbar扩展异步任务{
//显示进度条对话框
Context-appContext=getApplicationContext();
@抑制警告(“弃用”)
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
显示对话框(进度条类型);
出版进度(“0”);
}
@凌驾
受保护的Void doInBackground(Void…结果){
试试{
//你的代码
//.........
//.........
publishProgress(“+(int)((count*100)/lenghtOfFile));//更新进度条
}捕获(例外e){
Log.e(“错误:,e.getMessage());
}
返回null;
}
//更新进度条
受保护的void onProgressUpdate(字符串…进度){
pDialog.setProgress(Integer.parseInt(progress[0]));
}
//关闭“进度”对话框
@抑制警告(“弃用”)
@凌驾
受保护的void onPostExecute(void结果){
//关闭对话框
解雇对话框(进度条类型);
}
}

在..reghandler.post()中创建
处理程序
并更新您的
进度
。我在UI线程上创建reghandler我的处理程序是在UI线程上创建的,我将Runnable发布到该线程。我觉得没关系。tbh id不希望使用AsyncTask,如果我可以使用线程来完成它。我使用“reghandler,post()”在UI线程上发布UI更新,如上所示。在这种情况下,如果我可以用线程来完成,我不想使用AsyncTask。我在构造函数中创建它。reghandler=newhandler();在UI线程上。你能给我解释一下。。。您的问题是:“进度未更新”还是“无5秒延迟更新”?还是别的什么?很抱歉,我不太明白一个问题。)基本上,当我按下按钮时,进度对话框不会出现。我在button方法Thread.start()中有;它只是没有出现。没有AsyncTask可以完成吗??如果需要,我会使用它,但我更喜欢只使用线程。只有在后台任务简单(不长)的情况下,才能使用AsyncTask。您可以使用Executors()注册设备可能需要一段时间,因此我选择使用线程。
@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);

    }

}