Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:使用句柄重复一个方法并在x秒后延迟另一个方法_Android - Fatal编程技术网

Android:使用句柄重复一个方法并在x秒后延迟另一个方法

Android:使用句柄重复一个方法并在x秒后延迟另一个方法,android,Android,我是android新手,我有个问题 我使用相同的代码对两个类重复和延迟方法。一个班可以,但另一个班不行。我不知道为什么。这是我的密码 SpeedMeterFragment.java public class SpeedMeterFragment extends Fragment { .... public void speedMeterBefore() { totalRxBytesBefore = TrafficStats.getTotalRxBytes();

我是android新手,我有个问题 我使用相同的代码对两个类重复和延迟方法。一个班可以,但另一个班不行。我不知道为什么。这是我的密码

SpeedMeterFragment.java

public class SpeedMeterFragment extends Fragment {
    ....
    public void speedMeterBefore() {
        totalRxBytesBefore = TrafficStats.getTotalRxBytes();
        Log.d("test", "Before: " + String.valueOf(totalRxBytesBefore));
    }

    public void speedMeterAfter() {
        totalRxBytesAfter = TrafficStats.getTotalRxBytes();
        Log.d("test", "After: " + String.valueOf(totalRxBytesAfter));
    }

    public void speedMeterDifference() {
        totalRxBytesDifference = totalRxBytesAfter - totalRxBytesBefore;
        tvTest.setText(String.valueOf(totalRxBytesDifference/1024) + " kb/s");
        Log.d("test", "Difference: " + String.valueOf(totalRxBytesDifference));
    }

    public void speedMeter() {
        handler = new Handler();
        handler.post(runnable = new Runnable() {

            @Override
            public void run() {
                speedMeterBefore();
                final Handler handler1 = new Handler();
                handler1.postDelayed(new Runnable() {

                    @Override
                    public void run() {
                        speedMeterAfter();
                        speedMeterDifference();
                    }
                }, 1000);
                handler.postDelayed(this, 1000);
            }
        });
    }
}
public class SaveDataUseage extends BroadcastReceiver {
    ...

    public void onReceive(Context context, Intent intent) {
        ...
        savePreference();
    }

    public void savePreference() {
        ...
        measureDataMB();        
    }

    public void measureDataMBBefore() {
        dataMBBefore = TrafficStats.getTotalRxBytes() / 1048576;
    }

    public void measureDataMBAfter() {
        dataMBAfter = TrafficStats.getTotalRxBytes() / 1048576;
    }

    public void measureDataMBDifference() {
        dataMBDifference = dataMBAfter - dataMBBefore;
    }

    public void measureDataMB() {
        handler = new Handler();
        handler.post(runnable = new Runnable() {

            @Override
            public void run() {
                measureDataMBBefore();
                final Handler handler1 = new Handler();
                handler1.postDelayed(new Runnable() {

                    @Override
                    public void run() {
                        measureDataMBAfter();
                        measureDataMBDifference();
                    }
                }, 1000);
                handler.postDelayed(this, 1000);
            }
        });
    }
}
SaveDataUseage.java

public class SpeedMeterFragment extends Fragment {
    ....
    public void speedMeterBefore() {
        totalRxBytesBefore = TrafficStats.getTotalRxBytes();
        Log.d("test", "Before: " + String.valueOf(totalRxBytesBefore));
    }

    public void speedMeterAfter() {
        totalRxBytesAfter = TrafficStats.getTotalRxBytes();
        Log.d("test", "After: " + String.valueOf(totalRxBytesAfter));
    }

    public void speedMeterDifference() {
        totalRxBytesDifference = totalRxBytesAfter - totalRxBytesBefore;
        tvTest.setText(String.valueOf(totalRxBytesDifference/1024) + " kb/s");
        Log.d("test", "Difference: " + String.valueOf(totalRxBytesDifference));
    }

    public void speedMeter() {
        handler = new Handler();
        handler.post(runnable = new Runnable() {

            @Override
            public void run() {
                speedMeterBefore();
                final Handler handler1 = new Handler();
                handler1.postDelayed(new Runnable() {

                    @Override
                    public void run() {
                        speedMeterAfter();
                        speedMeterDifference();
                    }
                }, 1000);
                handler.postDelayed(this, 1000);
            }
        });
    }
}
public class SaveDataUseage extends BroadcastReceiver {
    ...

    public void onReceive(Context context, Intent intent) {
        ...
        savePreference();
    }

    public void savePreference() {
        ...
        measureDataMB();        
    }

    public void measureDataMBBefore() {
        dataMBBefore = TrafficStats.getTotalRxBytes() / 1048576;
    }

    public void measureDataMBAfter() {
        dataMBAfter = TrafficStats.getTotalRxBytes() / 1048576;
    }

    public void measureDataMBDifference() {
        dataMBDifference = dataMBAfter - dataMBBefore;
    }

    public void measureDataMB() {
        handler = new Handler();
        handler.post(runnable = new Runnable() {

            @Override
            public void run() {
                measureDataMBBefore();
                final Handler handler1 = new Handler();
                handler1.postDelayed(new Runnable() {

                    @Override
                    public void run() {
                        measureDataMBAfter();
                        measureDataMBDifference();
                    }
                }, 1000);
                handler.postDelayed(this, 1000);
            }
        });
    }
}
SpeedMeter碎片工作正常,但无法保存数据Usage 有人帮我吗? 对不起,我的英语不好:)

此代码将在每秒钟后重复此方法

handler = new Handler();

final Runnable r = new Runnable() {
    public void run() {

//Your method called here

MyMethod(isCalledFromHandeler);

        handler.postDelayed(this, 1000);
    }
};

handler.postDelayed(r, 1000);
使用
boolean
参数
iscalledfromHandler
识别方法的调用方。
然后使用

if(isCalledFromHandeler){
// Do Not call the Child Method

} else{

// Call the Child Method
}

虽然这是一个八个月前的问题,但我也遇到了类似的问题,在解决方案中,我用post-repeated方法将类扩展到

示例用法

AdvanceHandler handler = new AdvanceHandler();
handler.postRepeated(new Runnable() {
            @Override
            public void run() {
                //Your repeated task
            }
        }, 5000) //After every 5 seconds

你能解释一下处理程序里面的处理程序吗?你有没有试着记录接收器是否被激活?它到达measureDataMB()函数了吗?这就是我的意思:method1每1秒重复一次,method1中有method2,method3在method2调用后1秒执行,我知道,但在我的方法中,还有其他方法在调用某个方法后延迟x秒执行。也就是说,method1每1秒重复一次,在method1中有method2,method3在method2调用后1秒执行,此时您必须编写一些if-else条件。