我在我的方法LlamadoServicio在后台执行时尝试实现进度条。
我需要使用progressDialog锁定屏幕并隐藏此元素以完成该过程" LlamadoServicio()"。
我的方法
progress = ProgressDialog.show(Menu.this, null, null, true);
progress.setContentView(R.layout.elemento_progress_dialog);
new Thread(new Runnable() {
public void run() {
LlamadoServicio("david");
mHandler.post(new Runnable() {
public void run() {
progress.dismiss();
}
});
}
}).start();
答案 0 :(得分:5)
您可以使用异步任务。
private class AsyncTaskSample extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void) {
LlamadoServicio("david");
}
@Override
protected void onPostExecute(Void) {
progress.dismiss();
}
@Override
protected void onPreExecute() {
// Things to be done before execution of long running operation. For
// example showing ProgessDialog
progress = ProgressDialog.show(Menu.this, null, null, true);
progress.setContentView(R.layout.elemento_progress_dialog);
progress.show();
}
}
以下是关于android中的异步任务的一些很好的参考资料。
http://codetheory.in/android-asynctask/
http://www.compiletimeerror.com/2013/01/why-and-how-to-use-asynctask.html#.Vo87yfl97IU
答案 1 :(得分:2)
您的代码将执行的操作是,它将显示一个进度对话框,并将通过调用LlamadoServicio("david")
开始执行其工作。同时,处理程序将关闭进度对话框。
有两种方法可以做到这一点:
1)使用AsyncTask
,在onPreExecute()
函数中显示进度对话框,在LlamadoServicio("david")
函数中调用doInBackground
并在onPostExecute
函数中关闭进度对话框。< / p>
2)如果您仍想使用Thread
和Handler
,则需要更改以下代码:
progress = ProgressDialog.show(Menu.this, null, null, true);
progress.setContentView(R.layout.elemento_progress_dialog);
new Thread(new Runnable() {
public void run() {
LlamadoServicio("david");
}
}).start();
您的 LlamadoServicio 代码:
void LlamadoServicio(String value) {
// do your job
mHandler.sendEmptyMessage(0);
}
您的处理程序代码:
Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
progress.dismiss();
return false;
}
});
答案 2 :(得分:2)
如果您需要在代码在后台运行时锁定屏幕,我个人认为您应该在这种情况下使用异步任务。
private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void) {
/* do your background work */
}
@Override
protected void onPostExecute(Void) {
progress.dismiss();
}
@Override
protected void onPreExecute() {
// Things to be done before execution of long running operation. For
// example showing ProgessDialog
progress = ProgressDialog.show(Menu.this, null, null, true);
progress.setContentView(R.layout.elemento_progress_dialog);
// use this if you want to lock the screen.
progress.setCancelable(false);
progress.show();
}
}
2。你这样做的方式是错误的,因为在run()
方法中你会通过调用方法给你的服务打电话:
LlamadoServicio("david");
假设您的服务已启动,但此调用不会阻止处理程序发布runnable。因此它将取消进度条。
答案 3 :(得分:0)
更正实施线程
private class MyAsyncClass extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
progress = ProgressDialog.show(RegistroAuto.this, null, null, true);
progress.setContentView(R.layout.elemento_progress_dialog);
progress.show();
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
autosConsulta = LlamadoServicio(placa);
if (autosConsulta != null) {
autosConsulta.setSerie(serie.replaceAll(" ","").trim());
hp.nuevoAuto(autosConsulta);
startActivity(new Intent(RegistroAuto.this, PrincipalAutos.class));
finish();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
progress.dismiss();
finish();
super.onPostExecute(result);
}
}