java - Android - 如何连续运行一个线程,一个接一个

标签 java android multithreading handler runnable

所以我下面有下面的代码,它基本上获取初始电池电量,等待一定的时间,并获取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);
    }
}

以及我对执行方法的调用:

    // Start the task loop
    new BatteryLifeTask(getApplicationContext(), startButton).execute();
<小时/>

我发现了问题:

我忘记设置@Override注释,这个答案:https://stackoverflow.com/a/11127996/2247192状态:

"If your params of onPostExecute(Param param) don't match the one you defined with extends AsyncTask<...,...,Param> and you didn't use the @Override annotation, it will never be executed and you don't get a warning from 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);
         }
 }

请注意,此代码未经测试。但我希望它能给你一个想法:-)

关于java - Android - 如何连续运行一个线程,一个接一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27820764/

相关文章:

Java并发访问ArrayList

java - Android 上 .flatMap() 内的奇怪调度程序行为

java - 注释一个bean @DependsOn 是否意味着依赖bean 将被实例化或初始化?

java - 构建 Java 语言的扩展 - 步骤?

android - 隐藏导航栏而不在android上生根

android - 用于滑动 youtube 视频的 FragmentPagerAdapter 第二次无法正常工作

node.js - 如何在 Node JS 中执行/中止长时间运行的任务?

java - 格式化代码时保持语句彼此相邻

java - XML Pull 解析器异常 - kSOAP2

java - 线程状态 TimedWait。如何调试?