我在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线程等待注册线程完成。因此我没有看到进步对话。哎呀!
答案 0 :(得分:0)
答案 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);
}
}