簡體   English   中英

Android-如何連續不斷地運行線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM