我想在验证asynctask中显示5secs的圆圈不确定进度条,问题是5秒后我的应用程序崩溃
错误是:"只有创建视图层次结构的原始线程才能触及其视图。"
我在我的进度条中使用了Timer。
class VerifyStudIDTask extends AsyncTask<String, Void, String> {
// use doInBackground() to make network calls, the returned value is
// sent to onPostExecute()
@Override
protected String doInBackground(String... data) {
String StudID = data[0];
if (StudID.replace(" ", "").isEmpty()) {
f8 = true;
return "1";
}
else if (StudID.contains(" "))
{
f8 = true;
return "2";
}
else if (!StudID.matches("\\d+"))
{
f8 = true;
return "3";
}
else if(checkIfSameStudID(StudID))
{
f8 = true;
return "4";
}
else
{
f8 = false;
return "5";
}
}
@Override
protected void onPreExecute() {
loading_bar.setVisibility(View.VISIBLE);
super.onPreExecute();
}
@Override
protected void onPostExecute(String result) {
long delayInMillis = 5000;
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
loading_bar.setVisibility(View.INVISIBLE);
}
}, delayInMillis);
tilStudID.setErrorEnabled(true);
switch(result)
{
case "1": tilStudID.setError("You can't leave this empty.");break;
case "2": tilStudID.setError("No spaces allowed.");break;
case "3": tilStudID.setError("Numbers only.");break;
case "4": tilStudID.setError("Student ID already used.");break;
default: tilStudID.setError(null);tilStudID.setErrorEnabled(false);break;
}
}
}
答案 0 :(得分:0)
要实现所需的行为,您需要在UI线程中更新视图。
为此,您需要调用runOnUiThread
方法并传递runnable以更新视图。
timer.schedule(new TimerTask() {
@Override
public void run() {
activity.runOnUiThread(new Runnable(){
loading_bar.setVisibility(View.INVISIBLE);
}
}
}, delayInMillis);
答案 1 :(得分:0)
请勿在Android中使用Timer
。它是SDK中包含的遗留Java类,用于支持现有库。正如您所发现的那样,这是一个重量级的解决方案,可以启动额外的线程并需要额外的代码才能正常工作。对于此类简单延迟和间隔,请创建Handler
并使用Handler#postDelayed(...)
。