[英]Android - How do I continuously run a thread, one after another
所以我有下面的代碼,下面的代碼主要用於計算初始電池電量,等待一定時間,並在calculateHelper中獲取電池電量的最終值,然后查找差異並打印出來。
// Get the initial battery level
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = this.registerReceiver(null, ifilter);
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
System.out.println("Initial battery level is: " + level);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
final float batteryPctTemp0 = level / (float) scale;
final float batteryPct0 = batteryPctTemp0 * 100;
int waitTime = 60000 * interval; // 1 minute is 60000 miliseconds
System.out.println("Wait time is " + waitTime);
Runnable r = new Runnable() {
@Override
public void run(){
calculateHelper(batteryPct0,startButton);
}
};
Handler h = new Handler();
h.postDelayed(r, waitTime);
我想無限循環(直到程序退出)整個過程,以便在每個連續線程完成后,下一個線程開始,每次獲取一個新的初始電池電量,並將其傳遞到calculateHelper函數中以計算新的差值。 我不希望線程堆積。 我一次想要一個線程。 換句話說,循環需要在啟動另一個線程之前等待線程完成。
我一輩子都無法弄清楚該怎么做! 如果我把整個事情放一會兒,它只會反復打開使手機崩潰的線程。
如果有人能在這個問題上為我指明正確的方向,我將不勝感激。 另外,如果需要更多代碼來解決問題,只需注釋一下,將其添加到問題中后,我會立即答復。
謝謝。
感謝Whooper,我添加了這種在循環中調節執行順序的方法。 但是,由於某種原因,我的postExecute()方法從未執行過,並且沒有任何反應。
private class BatteryLifeTask extends AsyncTask<Void, Void, Void> {
// Member variables
Context appContext;
float batteryPct0;
Button startButton;
public BatteryLifeTask(Context context, Button start) {
super();
appContext = context;
startButton = start;
}
protected Void doInBackground(Void... params) {
// Get the initial battery level
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = appContext.registerReceiver(null, ifilter);
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
System.out.println("Initial battery level is: " + level);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
final float batteryPctTemp0 = level / (float) scale;
batteryPct0 = batteryPctTemp0 * 100;
return null;
}
protected void onPostExecute() {
int waitTime = 60000 * interval; // 1 minute is 60000 miliseconds
System.out.println("In postExecute. waitTime is" + waitTime);
Runnable r = new Runnable() {
@Override
public void run(){
System.out.println("An interval has passed.");
calculateHelper(batteryPct0,startButton);
new BatteryLifeTask(appContext,startButton).execute();
}
};
Handler h = new Handler();
h.postDelayed(r, waitTime);
}
}
和我對execute方法的調用:
// Start the task loop
new BatteryLifeTask(getApplicationContext(), startButton).execute();
我發現了問題:
我忘了設置@Override批注,這個答案: https ://stackoverflow.com/a/11127996/2247192指出:
“如果onPostExecute(Param param)的參數與用AsyncTask <...,...,Param>擴展定義的參數不匹配,並且您沒有使用@Override注釋,它將永遠不會執行,並且您不要從Eclipse得到警告。”
因此,我已將postExecute方法更正為:
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
int waitTime = 60000 * interval; // 1 minute is 60000 miliseconds
System.out.println("In postExecute. waitTime is " + waitTime);
Runnable r = new Runnable() {
@Override
public void run(){
System.out.println("An interval has passed.");
calculateHelper(batteryPct0,startButton);
new BatteryLifeTask(appContext,startButton).execute();
}
};
Handler h = new Handler();
h.postDelayed(r, waitTime);
}
現在,所有問題都已解決。
嘗試使用AsyncTask。 http://developer.android.com/reference/android/os/AsyncTask.html
這樣,您可以在調用onPostExecute()時再次執行任務。
像這樣:
private class BatteryLifeTask extends AsyncTask<Void, Void, Void> {
protected void doInBackground(Void... params) {
// Get the initial battery level
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = this.registerReceiver(null, ifilter);
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
System.out.println("Initial battery level is: " + level);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
final float batteryPctTemp0 = level / (float) scale;
final float batteryPct0 = batteryPctTemp0 * 100;
}
protected void onPostExecute() {
int waitTime = 60000 * interval; // 1 minute is 60000 miliseconds
Runnable r = new Runnable() {
@Override
public void run(){
new BatteryLifeTask.execute();
}
};
Handler h = new Handler();
h.postDelayed(r, waitTime);
}
}
請注意,此代碼未經測試。 但我希望它能給您一個主意:-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.