2016-10-02 685 views
0

嗨,我的应用程序需要一个来自数据库的实时数据,我将它发布在我的TextView上,并且我无法在数据库更新时更新TextView。我尝试使用Timer,但它仍然是一样的。Android Studio每5秒更新一次textview

这里是我的代码,

public void startTimer() { 
    //set a new Timer 
    timer = new Timer(); 

    //initialize the TimerTask's job 
    initializeTimerTask(); 

    timer.schedule(timerTask, 0, 5000); 
} 

private void stopTimerTask() { 
    //stop the timer, if it's not already null 
    if (timer != null) { 
     timer.cancel(); 
     timer = null; 
    } 
} 

public void initializeTimerTask() { 
    timerTask = new TimerTask() { 
     public void run() { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        final AcceptCars Cars = (AcceptCars) getIntent().getSerializableExtra("cars"); 
        renterLat.setText(Cars.renterLat); 
        renterLng.setText(Cars.renterLng); 
        Log.d(TAG,renterLat.getText().toString()); 
        Log.d(TAG,renterLng.getText().toString()); 
       } 
      }); 
     } 
    }; 
} 

而且这里是我得到的Cars.renterLatCars.renterLng

public class AcceptCars implements Serializable { 

    @SerializedName("renterLat") 
    public String renterLat; 

    @SerializedName("renterLng") 
    public String renterLng; 

} 
+0

更新的文字应该是里面** ** runOnUiThread是 – Saveen

+0

请不要让我知道,如果你还有什么问题 – Saveen

+0

@Saveen - 它仍然没有更新的TextView当我从变化值数据库先生。即使在日志中... –

回答

0

这是你应该遵循的逻辑。我用Handler而不是Timer。在run方法中,您需要调用webservice并从db获取更新值。使用runOnUiThreadThread更新UI的值。

请参见下面的代码,

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Handler taskHandler = new Handler(); 
    taskHandler.postDelayed(myTask, 0); 
} 

private Runnable myTask = new Runnable(){ 
     public void run() { 

      queryDb(); 

      // repeat the task 
      taskHandler.postDelayed(this, 1000); 
     } 
}; 

private void queryDb(){ 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 

      // call you webservice 
      String data = callWebservice(); 

      // parse the data in to AcceptCars pojo class 
      AcceptCars Cars = parseData(data); 

      //update the UI 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        renterLat.setText(Cars.renterLat); 
        renterLng.setText(Cars.renterLng); 
       } 
      }); 
     } 
    }).start(); 
} 
0

TimerTask s为真的很难对付IMO。您应该使用Handler并在一段时间后致电postDelayed做某件事。

或者,你可以尝试一下这个定时器类我写道:

import android.os.Handler; 

public class Timer { 
    private Handler handler; 
    private boolean paused; 

    private int interval; 

    private Runnable task = new Runnable() { 
     @Override 
     public void run() { 
      if (!paused) { 
       runnable.run(); 
       Timer.this.handler.postDelayed (this, interval); 
      } 
     } 
    }; 

    private Runnable runnable; 

    public int getInterval() { 
     return interval; 
    } 

    public void setInterval(int interval) { 
     this.interval = interval; 
    } 

    public void startTimer() { 
     paused = false; 
     handler.postDelayed (task, interval); 
    } 

    public void stopTimer() { 
     paused = true; 
    } 

    public Timer (Runnable runnable, int interval, boolean started) { 
     handler = new Handler(); 
     this.runnable = runnable; 
     this.interval = interval; 
     if (started) 
      startTimer(); 
    } 
} 

这是非常简单易用。

您可以使用它像这样:

Timer timer = new Timer(new Runnable() { 
    public void run() { 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       final AcceptCars Cars = (AcceptCars) getIntent().getSerializableExtra("cars"); 
       renterLat.setText(Cars.renterLat); 
       renterLng.setText(Cars.renterLng); 
       Log.d(TAG,renterLat.getText().toString()); 
       Log.d(TAG,renterLng.getText().toString()); 
      } 
     } 
    } 
}, 5000, true);