Android 的看门狗
Watchdog for Android
为了防止在 Android 上发生 ANR,您可以实施一个 Watchdog Timer,这需要有另一个线程 运行 并等待心跳。如果您希望您的应用程序具有 30FPS 的刷新率,请注意低于 15FPS 的刷新率。这也涵盖了您将来可能遇到 ANR 的情况。
如果你知道UI可能会长时间卡住的地方,你可以构建看门狗来防止这种情况(例如跳过当前帧)。 如果时间太长,您为什么要在 UI 上执行此操作? 如果您执行的操作是指重绘屏幕,则您不能在其他地方执行此操作。
这里我做了一个看门狗的简单例子
public class MainActivity extends AppCompatActivity {
int count = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Thread watchdogThread = new Thread(new Runnable() {
long lastT = System.currentTimeMillis();
long lastCount = 0;
long missed = 0;
@Override
public void run() {
while(true){
if (System.currentTimeMillis()-lastT>1500){
if (count == lastCount){
missed++;
}
lastCount = count;
if (missed > 3){
Log.e("test", "Error");
}
lastT = System.currentTimeMillis();
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
watchdogThread.start();
startCycleUI();
}
private void startCycleUI() {
//Runs on UI Thread
long lastT = System.currentTimeMillis();
while(true){
if (System.currentTimeMillis()-lastT>1000){
if (count < 10) {
count++;
}
lastT = System.currentTimeMillis();
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
当您不知道去哪里查看时,有没有一种方法可以构建一个只需重新启动应用程序的看门狗定时器?这个看门狗计时器如何在应用程序上下文之外生存?
您可以使用 "Java Source Code Warehouse" project
中的示例
您可以选择:
监控特定进程中的内存
如果他们不这样做就终止进程 return
检查系统内存使用情况,根据需要调度kills/reboots。
为了防止在 Android 上发生 ANR,您可以实施一个 Watchdog Timer,这需要有另一个线程 运行 并等待心跳。如果您希望您的应用程序具有 30FPS 的刷新率,请注意低于 15FPS 的刷新率。这也涵盖了您将来可能遇到 ANR 的情况。
如果你知道UI可能会长时间卡住的地方,你可以构建看门狗来防止这种情况(例如跳过当前帧)。 如果时间太长,您为什么要在 UI 上执行此操作? 如果您执行的操作是指重绘屏幕,则您不能在其他地方执行此操作。
这里我做了一个看门狗的简单例子
public class MainActivity extends AppCompatActivity {
int count = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Thread watchdogThread = new Thread(new Runnable() {
long lastT = System.currentTimeMillis();
long lastCount = 0;
long missed = 0;
@Override
public void run() {
while(true){
if (System.currentTimeMillis()-lastT>1500){
if (count == lastCount){
missed++;
}
lastCount = count;
if (missed > 3){
Log.e("test", "Error");
}
lastT = System.currentTimeMillis();
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
watchdogThread.start();
startCycleUI();
}
private void startCycleUI() {
//Runs on UI Thread
long lastT = System.currentTimeMillis();
while(true){
if (System.currentTimeMillis()-lastT>1000){
if (count < 10) {
count++;
}
lastT = System.currentTimeMillis();
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
当您不知道去哪里查看时,有没有一种方法可以构建一个只需重新启动应用程序的看门狗定时器?这个看门狗计时器如何在应用程序上下文之外生存?
您可以使用 "Java Source Code Warehouse" project
中的示例您可以选择:
监控特定进程中的内存
如果他们不这样做就终止进程 return
检查系统内存使用情况,根据需要调度kills/reboots。