您好我正在尝试执行下面的代码,假设打开一个加载对话框并在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教程。
谢谢!
答案 0 :(得分:3)
在日志中:
RuntimeException:无法在没有的线程内创建处理程序 叫做Looper.prepare()
表示您正在尝试从非ui线程更新或访问UI元素。因此,您需要使用Activity.runOnUiThread,Handler或AsyncTask
来更新或访问其他线程的用户界面。这样做:
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处理接收该广播并按照您的意愿对其进行操作。