2017-02-26 1 views
1

内ProgressBarの)(タイマーを追加し、問題が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を使用しないでください。既存のライブラリをサポートするために、SDKに含まれていた従来のJavaクラスです。余分なスレッドを起動し、発見したように正しく動作するためには余分なコードが必要な重いソリューションです。このような単純な遅延と間隔については、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

ありがとう、私はケビンが言ったことをしました。 (ハンドラを使用) –

関連する問題