2016-10-02 649 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);