在Asynctask中为Progressbar添加Timer()

时间:2017-02-26 02:14:50

标签: android timer android-asynctask

我想在验证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;



            }

    }
}

2 个答案:

答案 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(...)