Android进度对话框在线程中崩溃时崩溃

时间:2013-05-09 19:41:30

标签: java android handler

您好我正在尝试执行下面的代码,假设打开一个加载对话框并在if语句中将其关闭。

这是代码:

loginBtn.setOnClickListener(new OnClickListener() 
         {
            @Override
            public void onClick(View view)
            {

                final ProgressDialog progress  = ProgressDialog.show(thisActivity, "Please wait", "Loading please wait..", true);
                Thread loginThread = new Thread(new Runnable()
                {

                    @Override
                    public void run() 
                    {

                        try
                        {
                            boolean userAllowed = login.loginUser(userEmail.getText().toString(), userPass.getText().toString());
                            if(userAllowed) 
                            {
                                progress.dismiss();
                                startActivity(mainPage);
                            }
                            else
                            {
                                progress.dismiss();
                                Toast.makeText(context, "Invalide email and password", Toast.LENGTH_LONG).show();
                            }
                        }
                        catch (Exception e) 
                        {
                            Toast.makeText(context, "There is some problem", Toast.LENGTH_LONG).show();
                        }

                    }
                });
                loginThread.start();
            }
         });

logCat错误输出为:

05-09 22:37:26.508: E/AndroidRuntime(24820): FATAL EXCEPTION: Thread-1306
05-09 22:37:26.508: E/AndroidRuntime(24820): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
05-09 22:37:26.508: E/AndroidRuntime(24820):    at android.os.Handler.<init>(Handler.java:197)
05-09 22:37:26.508: E/AndroidRuntime(24820):    at android.os.Handler.<init>(Handler.java:111)
05-09 22:37:26.508: E/AndroidRuntime(24820):    at android.widget.Toast$TN.<init>(Toast.java:324)
05-09 22:37:26.508: E/AndroidRuntime(24820):    at android.widget.Toast.<init>(Toast.java:91)
05-09 22:37:26.508: E/AndroidRuntime(24820):    at android.widget.Toast.makeText(Toast.java:238)
05-09 22:37:26.508: E/AndroidRuntime(24820):    at com.shale.activities.MainActivity$1$1.run(MainActivity.java:93)
05-09 22:37:26.508: E/AndroidRuntime(24820):    at java.lang.Thread.run(Thread.java:856)

我的参考资料是this教程。

谢谢!

3 个答案:

答案 0 :(得分:3)

在日志中:

  

RuntimeException:无法在没有的线程内创建处理程序   叫做Looper.prepare()

表示您正在尝试从非ui线程更新或访问UI元素。因此,您需要使用Activity.runOnUiThreadHandlerAsyncTask来更新或访问其他线程的用户界面。这样做:

 Your_Activity.this.runOnUiThread(new Runnable() {

      @Override
      public void run() {
            //update Ui elements here
        }
     });

答案 1 :(得分:1)

除非您在UI线程上,否则您无法执行任何与UI相关的操作(包括解除对话框)。您需要通过runOnUiThread卸载它,或者通过将消息传递给UI线程上的处理程序。或者更好 - 使该线程成为AsyncTask并在onPostExecute()

中执行

答案 2 :(得分:0)

上述方法的另一种选择是发送广播并让BroadcastReceiver处理接收该广播并按照您的意愿对其进行操作。