2017-07-26 93 views

回答

2

@BaptisteM,而不是使用的AsyncTask这个的,你可以使用处理器和Runnable的这个样子,

private void startColorTimer() { 
    mColorHandler.postDelayed(ColorRunnable, interval); 
    timerOn = true; 
} 

private Handler mColorHandler = new Handler(); 

private Runnable ColorRunnable = new Runnable() { 

    @Override 
    public void run() { 
     coloredTextView.setTextColor(getRanColor()); 

     if (timerOn) { 
      mColorHandler.postDelayed(this, interval); 
     } 
    } 
}; 
0

这个问题已经被问到,我开始回答,但一个主持人关闭它,所以我把我的例子放在这里。

这个例子每1000毫秒随机地改变一个TextView的颜色。 间隔可以更改。

package com.your.package; 

import android.graphics.Color; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.widget.TextView; 

import java.util.Random; 

public class MainActivity extends AppCompatActivity { 

    TextView coloredTextView; 
    long interval = 1000; //in ms 
    boolean timerOn = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     coloredTextView = (TextView) findViewById(R.id.colorTextView); 
     startColorTimer(); 
    } 

    private void startColorTimer(){ 
     new ColorTimer().execute(); 
     timerOn=true; 
    } 

    private void stopColorTimer(){ 
     timerOn=false; 
    } 

    private class ColorTimer extends AsyncTask<Void, Void, Void> { 

     public ColorTimer() { 
      timerOn=true; 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      try { 
       Thread.sleep(interval); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
      coloredTextView.setTextColor(getRanColor()); 
      if(timerOn) new ColorTimer().execute(); 
     } 


     private int getRanColor() { 
      Random rand = new Random(); 
      return Color.argb(255, rand.nextInt(256), rand.nextInt(256), rand.nextInt(256)); 
     } 

     @Override 
     protected void finalize() throws Throwable { 
      super.finalize(); 
      timerOn=false; 
     } 
    } 
} 

activity_main.xml中:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="fr.rifft.bacasable.MainActivity"> 

    <TextView 
     android:id="@+id/colorTextView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="8dp" 
     android:layout_marginTop="8dp" 
     android:text="Colored Text View" 
     android:textSize="30sp" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintTop_toTopOf="parent" /> 
</android.support.constraint.ConstraintLayout> 

我希望它可以帮助。

+0

是不是最好使用Handler和的Runnable,而不是实现一个完整的AsyncTask类? – Ivan

0

您可以使用一个处理器类: https://developer.android.com/reference/android/os/Handler.html#postDelayed(java.lang.Runnable,长)

postHandler()统计时间在后台,并在事件发送到主线程时。

此外,您还可以使用复发的: https://en.wikipedia.org/wiki/Recursion_(computer_science)

final int[] colors = new int[]{ 
     0xFF0000FF, 
     0xFF00FF00, 
     0xFFFF0000, 
     0xFFFF00FF, 
}; 
final Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     findViewById(R.id.bg_to_change).setBackgroundColor(colors[new Random().nextInt(colors.length)]); 
     handler.postDelayed(this, 500); 
    } 
}, /*This is your X*/ 500); 
0

您可以使用TimerTask的这样做。

从开始计时的onResume()

@Override 
    public void onResume() { 
     super.onResume(); 
     startColor(); 
    } 

和的onStop停止定时器()

@Override 
    public void onStop() { 
     super.onStop(); 
     if (timer != null) 
      timer.cancel(); 
     if (task != null) 
      task.cancel(); 
    } 

而且下面的代码添加到您的活动。

TimerTask task; 
    Timer timer; 

    private void startColor() { 
     task = new TimerTask() { 
      @Override 
      public void run() { 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         coloredTextView.setBackgroundColor(getRanColor()); 
        } 
       }); 

      } 

      private int getRanColor() { 
       Random rand = new Random(); 
       return Color.argb(255, rand.nextInt(256), rand.nextInt(256), rand.nextInt(256)); 
      } 
     }; 
     timer = new Timer(); 
     timer.scheduleAtFixedRate(task, 0, 1000); 
    } 
0

,你可以这样做:

Handler mHandler = new Handler(); 

Timer timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() {   
    @Override 
    public void run() { 
     mHandler.post(new Runnable() {     
      @Override 
      public void run() { 
       //change color 
      } 
     }); 
    } 
}, 0, 5* 1000); // 5s 

停止它由:

timer.cancel(); 
1

试试这个,你可以使用TimerTask: - >可以安排一次性任务或定时器重复执行。

TimerTask

Timer timer; 
timer = new Timer(); 
timer.scheduleAtFixedRate(new RemindTask(), 0, 3000); // delay*/ 

private class RemindTask extends TimerTask 
{ 
int current = viewPager.getCurrentItem(); 
@Override 
public void run() { 
    runOnUiThread(new Runnable() { 
     public void run() { 
      coloredTextView.setTextColor(getRanColor()); 
     } 
    }); 

    } 

}