Java 使用ProgressDialog和线程时应用程序崩溃
这是我第一次使用ProgressDialog和线程。当我尝试使用ProgressDialog应用程序崩溃时 ProgressDialog和线程代码:Java 使用ProgressDialog和线程时应用程序崩溃,java,android,multithreading,handler,progressdialog,Java,Android,Multithreading,Handler,Progressdialog,这是我第一次使用ProgressDialog和线程。当我尝试使用ProgressDialog应用程序崩溃时 ProgressDialog和线程代码: pd = ProgressDialog.show(MainScreen.this, "Backup", "Please, wait...", true, true); final Handler handler = new Handler() { @Override public void
pd = ProgressDialog.show(MainScreen.this, "Backup", "Please, wait...", true, true);
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
pd.dismiss();
}
};
new Thread (new Runnable() {
public void run() {
Looper.prepare();
DB = new DataBase(MainScreen.this);
Cursor r = DB.fetchAllNames();
if (r.getCount() == 0){
File sdPath = Environment.getExternalStorageDirectory();
File sdPathDr = new File(sdPath.getAbsolutePath() + "/Pass_backup/" + DIR_SD);
if(!sdPathDr.exists()){
}
else {
File[] files = sdPathDr.listFiles();
if (files.length == 0){
}
else {
try {
restoring();
} catch (IOException e2) {
e2.printStackTrace();
}
}
}
}
else {
try {
backupAdapter();
} catch (IOException e1) {
e1.printStackTrace();
}
try {
restoring();
} catch (IOException e) {
e.printStackTrace();
}
}
handler.sendEmptyMessage(0);
}}).start();
线程内的代码正常工作,但随后应用程序崩溃。
日志:
03-29 15:49:06.754: E/AndroidRuntime(12608): FATAL EXCEPTION: Thread-8781
03-29 15:49:06.754: E/AndroidRuntime(12608): Process: com.ssd.passwordbook, PID: 12608
03-29 15:49:06.754: E/AndroidRuntime(12608):android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
03-29 15:49:06.754: E/AndroidRuntime(12608): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6094)
03-29 15:49:06.754: E/AndroidRuntime(12608): at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:857)
03-29 15:49:06.754: E/AndroidRuntime(12608): at android.view.ViewGroup.invalidateChild(ViewGroup.java:4320)
03-29 15:49:06.754: E/AndroidRuntime(12608): at android.view.View.invalidate(View.java:10942)
03-29 15:49:06.754: E/AndroidRuntime(12608): at android.view.View.invalidate(View.java:10897)
03-29 15:49:06.754: E/AndroidRuntime(12608): at android.widget.ImageView.invalidateDrawable(ImageView.java:201)
03-29 15:49:06.754: E/AndroidRuntime(12608): at android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:344)
03-29 15:49:06.754: E/AndroidRuntime(12608): at android.graphics.drawable.Drawable.setVisible(Drawable.java:575)
03-29 15:49:06.754: E/AndroidRuntime(12608): at android.widget.ImageView.onDetachedFromWindow(ImageView.java:1243)
03-29 15:49:06.754: E/AndroidRuntime(12608): at android.view.View.dispatchDetachedFromWindow(View.java:12627)
03-29 15:49:06.754: E/AndroidRuntime(12608): at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2585)
03-29 15:49:06.754: E/AndroidRuntime(12608): at android.view.ViewGroup.removeAllViewsInLayout(ViewGroup.java:4027)
03-29 15:49:06.754: E/AndroidRuntime(12608): at android.widget.AbsListView.resetList(AbsListView.java:1924)
03-29 15:49:06.754: E/AndroidRuntime(12608): at android.widget.ListView.resetList(ListView.java:521)
03-29 15:49:06.754: E/AndroidRuntime(12608): at android.widget.ListView.setAdapter(ListView.java:462)
03-29 15:49:06.754: E/AndroidRuntime(12608): at com.ssd.passwordbook.MainScreen.loaderAdapter(MainScreen.java:930)
03-29 15:49:06.754: E/AndroidRuntime(12608): at com.ssd.passwordbook.MainScreen.restoring(MainScreen.java:1068)
03-29 15:49:06.754: E/AndroidRuntime(12608): at com.ssd.passwordbook.MainScreen$9.run(MainScreen.java:728)
03-29 15:49:06.754: E/AndroidRuntime(12608): at java.lang.Thread.run(Thread.java:841)
那么,如何解决这个问题呢?看看AsyncTask类。 它是为这类事情而制造的 onPreExecute()在UI线程上运行,因此您可以在那里触摸UI,就像显示progressdialog一样 doInBackground(Params…)在后台线程中运行,因此您可以在这里完成繁重的工作 onPostExecute(Result)在UI线程上运行,因此您可以在此处显示后台线程的结果。还有。关闭progressdialog:) 只有创建视图层次结构的原始线程才能接触其 观点 此错误消息表示您正在主线程上创建进度对话框:
pd = ProgressDialog.show(MainScreen.this, "Backup", "Please, wait...", true, true);
pd.show();
但从另一个角度来看:
handler.sendEmptyMessage(0);
根据Android框架,您应该使用AsyncTask来完成这样的任务。它有一个
onProgressUpdate()
回调,您可以使用它来更新ProgressBar。可以找到一个示例。您是否在线程中执行ui工作。如果是,ui是否使用
runOnUiThread(new Runnable() {
public void run() {
//UI Works
}
});
我同意这个解决方案是可行的,但它并不像使用AsyncTask那样干净。是的,AsyncTask是最干净的方式。