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