0

嗨,我正在尝试执行下面的代码,假设打开一个加载对话框并在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)

我的参考是教程。

谢谢!

4

3 回答 3

3

如在日志中:

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

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

 Your_Activity.this.runOnUiThread(new Runnable() {

      @Override
      public void run() {
            //update Ui elements here
        }
     });
于 2013-05-09T19:44:30.023 回答
1

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

于 2013-05-09T19:44:54.930 回答
0

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

于 2013-05-09T19:52:13.547 回答