2016-05-21 11 views
0

私はAndroidスタジオを使用しています。私はボタンを押した時計を修正しようとしています。時刻は12時に戻されます。私はそれが働いているが、私はそれが250ミリ秒待って実行されたい。問題は250ミリ秒間待つだけですが(2回の実行で5秒なので)、テキストビューに表示せずにすぐに12:00になります。私が間違っていることはありますか?また、ここでハンドラ関数を適用した場合、私はそれを使う知識があまりないと思います。待機機能が動作しないAndroidスタジオ

編集:これは私のMainActivityメソッドからのものです。 2 1〜実施例、変更、その後250ミリ秒待つ、2から3への変化は、その後、250ミリ秒以下

synchronized (this){ 
    try { 
     while(minuteHand != 0 || hourHand != 12){ 
      if (hourHand != 12){ 
       hourHand++; 
       hourText.setText(Integer.toString(hourHand)); 
       wait(250); 
      } 
      if (minuteHand != 0) { 
       minuteHand += 5; 
       minuteHand %= 60; 
       minuteText.setText(Integer.toString(minuteHand)); 
       wait(250); 
      } 
     } 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

答えて

1

待つことは、非同期スレッドからUI要素を更新するための適切な方法である:

public class SampleActivity extends Activity { 
    private TextView hourText; 
    private TextView minuteText; 

    private void updateHourText(final String text) { 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       hourText.setText(text); 
      } 
     }); 
    } 

    private void updateMinuteText(final String text) { 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       minuteText.setText(text); 
      } 
     }); 
    } 

    private class ClockTask extends AsyncTask<Void, Void, Void> 
    { 
     private int hourHand; 
     private int minuteHand; 


     public ClockTask(int hourHand, int minuteHand) { 
      this.hourHand = hourHand; 
      this.minuteHand = minuteHand; 
     } 

     @Override 
     protected Void doInBackground(Void... voids) { 
      try { 
       while(minuteHand != 0 || hourHand != 12){ 
        if (hourHand != 12){ 
         hourHand++; 
         updateHourText(Integer.toString(hourHand)); 
         Thread.sleep(250); 
        } 
        if (minuteHand != 0) { 
         minuteHand += 5; 
         minuteHand %= 60; 
         updateMinuteText(Integer.toString(minuteHand)); 
         Thread.sleep(250); 
        } 
       } 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 
    } 
} 

new ClockTask(hourHand, minuteHand).execute(); 

あなたが見ることができるように、TextViewのテキストを更新するために、ヘルパーメソッドをしてneede:

してから、ボタンのonClickListener()からこれを呼び出しますdはメインスレッドの中で常にTextView.setText()を実行します。そうすれば、あなたのビジネスロジックは、TextViewを非同期に更新しながら、独自のスレッド内で(主スレッドを待たずに、応答の遅いUIにつながることなく)実行することができます。

また、例外がスローされるため、メインスレッドのコンテキスト外でUI要素を更新しようとしないでください。

+0

スレッドは使用しないでください。しかしどちらにせよ、私はまだ試してみる。また、プライベートであるためMainActivityに呼び出すことはできません。この新しいSampleActivity.ClockTask(hourHand、minuteHand).execute();のように呼びました – user6345865

+0

AsyncTaskではなくThreadを使用することができました。あなたがプライベートだと言ったらどういう意味ですか?たぶんあなたはいくつかのコードを提供し、正確に何を達成しようとしているのでしょうか。 –

+0

Erm、私はあなたがMainActivityに行ったコードを呼び出そうとしています。次に、私は試してみました: 'SampleActivity act = new SampleActivity();'次に 'act.ClockTask(hourHand、minuteHand).execute();' – user6345865

関連する問題