在我的应用程序中,我有一个sercice类,它有这个方法可以在做某事时显示进度对话框:
private void openprogresdialog() {
new AsyncTask<Integer, Integer, Boolean>()
{
ProgressDialog progressDialog;
@Override
protected void onPreExecute()
{
progressDialog = ProgressDialog.show(thisActivity, "Dialog","Loading...");
}
@Override
protected Boolean doInBackground(Integer... params)
{
if (params == null)
{
return false;
}
try
{
Thread.sleep(params[0]);
}
catch (Exception e)
{
Log.e("tag", e.getMessage());
return false;
}
return true;
}
@Override
protected void onPostExecute(Boolean result)
{
progressDialog.dismiss();
AlertDialog.Builder b = new AlertDialog.Builder(thisActivity);
b.setTitle(android.R.string.dialog_alert_title);
if (result)
{
b.setMessage("Download succeeded");
}
else
{
b.setMessage("Download failed");
}
b.setPositiveButton(getString(android.R.string.ok),
new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dlg, int arg1)
{
dlg.dismiss();
}
});
b.create().show();
}
}.execute(2000);
new Thread()
{
@Override
public void run()
{
DialogInterface progressDialog = null;
progressDialog.dismiss();
}
}.start();
}
我希望在应用程序执行时显示它的工作进度对话框,但是当我运行应用程序时,我收到此错误:
无法在未调用Looper.prepare()
的线程内创建处理程序
我该如何解决它?
编辑:
public class MyService extends Service {
private static final String TAG = "MyService";
Thread readthread;
final MyService thisActivity = this;
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
final ParentActivityData data = intent.getParcelableExtra("DATA");
readthread = new Thread(new Runnable() {
public void run() {
// SOME CODE TO EXECUTE //
}
openprogresdialog();
}
});
readthread.start();
Log.d(TAG, "onCreate");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onCreate() {
}
@Override
public void onDestroy() {
}
}
你有
readthread = new Thread(new Runnable() {
public void run() {
在线程的运行方法中,你有
openprogresdialog();
在openprogresdialog
中,你有一个异步任务和一个线程。
异步任务必须在 UI 线程上加载。查看以下链接中的线程规则主题。
http://developer.android.com/reference/android/os/AsyncTask.html
Can't create handler inside thread that has not called Looper.prepare()
无法在后台线程中更新 UI。应在 ui 线程上更新 UI。您的异步任务看起来不错,但必须在 ui 线程上加载。
还要删除下面无用的。也会给出NullPointerException
,因为progressDialog
没有初始化,你在初始化之前调用dismiss
new Thread()
{
@Override
public void run()
{
DialogInterface progressDialog = null;
progressDialog.dismiss(); // even if initialized cannot update ui in a thread
}
}.start();
尽管添加Looper.prepare()
可能是一个有效的选项,但如果可能的话,我宁愿添加使用Activity#runOnUIThread
。另外,你为什么要使用线程?
这里没有必要使用线程。
顺便说一句:你的代码
DialogInterface progressDialog = null;
progressDialog.dismiss();
将生成一个空指针异常...
只需在线程的开头添加Looper.prepare();
new Thread()
{
@Override
public void run()
{
Looper.prepare();
DialogInterface progressDialog = null;
progressDialog.dismiss();
}
}.start();
您应该在主 UI 线程中进行 UI 调用。如果您在其他线程中执行操作,则会收到此错误。由于您正在从新的 Thread() 调用 progressDialog.dismiss,因此您会收到此错误消息。
new Thread()
{
@Override
public void run()
{
Looper.prepare();
//Your Dialog goes here
Looper.loop();
}
}.start();
嘿嘿。