Android : 无法在未调用 Looper.prepare() 的线程中创建处理程序



在我的应用程序中,我有一个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();

嘿嘿。

相关内容

  • 没有找到相关文章

最新更新