0

在我的应用程序中,我有一个服务类,它具有在执行某些操作时显示进度对话框的方法:

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() {

    }
}
4

5 回答 5

1

你有

readthread = new Thread(new Runnable() {
            public void run() {

在线程的运行方法中,你已经

openprogresdialog();

openprogresdialog你有一个 Asynctask 和一个线程。

Asynctask 必须在 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 线程上更新。您的 Asynctask 看起来不错,但必须在 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();
于 2013-12-17T09:12:59.393 回答
1

虽然添加Looper.prepare()可能是一个有效的选项,但如果可能的话,我宁愿Activity#runOnUIThread在这里添加使用。另外,你为什么还要使用线程?

这里没有必要使用线程。

顺便说一句:你的代码

DialogInterface progressDialog = null;
progressDialog.dismiss();

将产生一个 NullpointerException...

于 2013-12-17T09:02:52.960 回答
0

您应该在主 UI 线程中进行 UI 调用。如果您在其他线程中执行此操作,则会收到此错误。由于您正在从新的 Thread() 调用 progressDialog.dismiss,因此您会收到此错误消息。

于 2013-12-17T09:12:07.630 回答
0

只需Looper.prepare();在您的线程的开头添加

new Thread()
    {
        @Override
        public void run()
        {
            Looper.prepare();
            DialogInterface progressDialog = null;
            progressDialog.dismiss();
        }
    }.start();
于 2013-12-17T08:56:52.753 回答
0
new Thread()
    {
        @Override
        public void run()
        {
            Looper.prepare();

            //Your Dialog goes here

            Looper.loop(); 
        }
    }.start();

HtH。

于 2015-04-15T10:16:26.767 回答