2017-02-26 28 views
1

我想顯示5secs了一圈不確定的進度欄我的驗證的AsyncTask裏面,問題是5secs我的應用程序崩潰,的進度添加定時器()裏面的AsyncTask

後的錯誤是:「只有創建原來的線程視圖層次結構可以觸及其視圖。「

我對我的進度條使用了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

請勿在Android中使用Timer。這是一個遺留的Java類,包含在SDK中以支持現有的庫。正如你發現的那樣,這是一個重量級的解決方案,它會啓動一個額外的線程並需要額外的代碼才能正常工作。對於這種簡單的延遲和間隔,創建一個Handler並使用Handler#postDelayed(...)

+0

謝謝!有效! :d –

0

要實現所需的行爲,您需要在UI線程中更新視圖。 要做到這一點,您可以調用runOnUiThread方法並傳遞可更新視圖的runnable。

timer.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       activity.runOnUiThread(new Runnable(){ 
        loading_bar.setVisibility(View.INVISIBLE); 
       } 
      } 
     }, delayInMillis); 
+0

謝謝你,但我做了什麼凱文說。 (使用處理程序) –

相關問題