我在新线程中实现了 ProgressDialog。
onCreate 中的代码
progressDialog = new ProgressDialog(this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("Verifying...");
progressDialog.setCancelable(true);
progressDialog.show();
t.start();
线程声明
Runnable r = new MyRunnable();
Thread t = new Thread(r);
可运行
public class MyRunnable implements Runnable {
@Override
public void run() {
Message msg = Message.obtain();
if (t.isInterrupted()) {
msg.recycle();
return;
}
long startTime = SystemClock.elapsedRealtime();
long duration = 5 * 60 * 1000; // 5 min
long percentageIntervalDuration = 2;
long interval = (duration * percentageIntervalDuration) / 100; // 6sec
int i = 0;
do {
if (SystemClock.elapsedRealtime() == (startTime + (i * interval))) {
msg.arg1 = (int) percentageIntervalDuration * i;
mainHandler.sendMessage(msg);
i++;
}
} while (i != (100 / percentageIntervalDuration) + 1);
}
}
附加到主线程的处理程序
Handler mainHandler = new Handler() {
public void handleMessage(Message msg) {
Log.d(TAG, String.valueOf(msg.arg1));
if (msg.arg1 == 100) {
progressDialog.dismiss();
} else {
progressDialog.setProgress(msg.arg1);
}
}
};
现在我面临两个问题
<强>1。当关闭 ProgressDialog 时,Logcat 中会出现以下错误消息
05-09 17:57:36.386: E/JavaBinder(9822): *** Uncaught remote exception! (Exceptions are not yet supported across processes.) 05-09 17:57:36.386: E/JavaBinder(9822): android.util.AndroidRuntimeException: { what=4 when=650507787 arg1=1 } This message is already in use. 05-09 17:57:36.386: E/JavaBinder(9822): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:171) 05-09 17:57:36.386: E/JavaBinder(9822): at android.os.Handler.sendMessageAtTime(Handler.java:457) 05-09 17:57:36.386: E/JavaBinder(9822): at android.os.Handler.sendMessageDelayed(Handler.java:430) 05-09 17:57:36.386: E/JavaBinder(9822): at android.os.Handler.sendMessage(Handler.java:367) 05-09 17:57:36.386: E/JavaBinder(9822): at android.view.inputmethod.InputMethodManager$1.setActive(InputMethodManager.java:428) 05-09 17:57:36.386: E/JavaBinder(9822): at com.android.internal.view.IInputMethodClient$Stub.onTransact(IInputMethodClient.java:83) 05-09 17:57:36.386: E/JavaBinder(9822): at android.os.Binder.execTransact(Binder.java:288) 05-09 17:57:36.386: E/JavaBinder(9822): at dalvik.system.NativeStart.run(Native Method) 05-09 17:57:36.386: E/JavaBinder(9822): *** Uncaught remote exception! (Exceptions are not yet supported across processes.) 05-09 17:57:36.386: E/JavaBinder(9822): android.util.AndroidRuntimeException: { what=100 when=650507787 } This message is already in use. 05-09 17:57:36.386: E/JavaBinder(9822): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:171) 05-09 17:57:36.386: E/JavaBinder(9822): at android.os.Handler.sendMessageAtTime(Handler.java:457) 05-09 17:57:36.386: E/JavaBinder(9822): at android.os.Handler.sendMessageDelayed(Handler.java:430) 05-09 17:57:36.386: E/JavaBinder(9822): at android.os.Handler.sendMessage(Handler.java:367) 05-09 17:57:36.386: E/JavaBinder(9822): at com.android.internal.view.IInputConnectionWrapper.dispatchMessage(IInputConnectionWrapper.java:182) 05-09 17:57:36.386: E/JavaBinder(9822): at com.android.internal.view.IInputConnectionWrapper.reportFullscreenMode(IInputConnectionWrapper.java:159) 05-09 17:57:36.386: E/JavaBinder(9822): at com.android.internal.view.IInputContext$Stub.onTransact(IInputContext.java:211) 05-09 17:57:36.386: E/JavaBinder(9822): at android.os.Binder.execTransact(Binder.java:288) 05-09 17:57:36.386: E/JavaBinder(9822): at dalvik.system.NativeStart.run(Native Method)
<强>2。 ProgressDialog 有时会卡住在特定的百分比。
最佳答案
从上一个问题来看,您可能每次都需要创建一个新的 Message 对象。 Android Handler Message and ListView
另外,这个讨论似乎指向 Message.clearForRecycle() 没有被调用? http://code.google.com/p/android/issues/detail?id=3318
也就是说,为什么不使用 AsyncTask?它非常适合后台任务 + 发布到 UI 线程,并且与进度对话框配合得很好。它具有在主后台线程工作运行之前和之后执行代码的预构建方法,并且能够将进度更新发布到 UI,并为您很好地隐藏所有处理程序内容。
http://androidresearch.wordpress.com/2012/03/17/understanding-asynctask-once-and-forever/
http://www.vogella.com/articles/AndroidPerformance/article.html#asynctask
关于android - 单独线程中的 ProgressDialog 给出 **未捕获的远程异常!**,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10516525/