java - Android 进度对话框在线程中关闭时崩溃

标签 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教程。

谢谢!

最佳答案

如日志中所示:

RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

意味着您正在尝试从非 ui Thread 更新或访问 UI 元素。所以你需要使用 Activity.runOnUiThread , HandlerAsyncTask 用于从其他线程更新或访问 UI。这样做:

 Your_Activity.this.runOnUiThread(new Runnable() {

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

关于java - Android 进度对话框在线程中关闭时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16469799/

相关文章:

java - Spring Batch - 无法@Autowired SimpleJobLauncher

android - 如何使用 Android 将 HTTP GET 请求发送到代理

android - 可以使用 Android Ion 启用永久磁盘缓存吗?

android - 如何从源代码编译 google android Gingerbread 日历应用程序?

java - #Pentaho 开源 BI 工具

java - Java HttpClient 中的 Curl cacert 等价物

javascript - JQuery Keyup 事件不起作用

ASP.NET:如何从处理程序访问 session ?

java - 电话验证凭证

event-handling - 在 jQuery 中设置单击事件的事件处理程序的执行顺序?