Watchdog for Android
为了防止Android上出现ANR,你可以实现一个看门狗定时器,它需要让另一个线程运行并等待心跳。 如果您希望您的应用程序具有30FPS的刷新率,请保护刷新率低于15FPS。 这也涵盖了将来可能有ANR的情况。
如果您知道UI可能会长时间卡住的位置,您可以构建看门狗以防止这种情况(例如跳过当前帧)。 如果它很长,你为什么要在用户界面上这样做? 如果您正在执行的操作是指重新绘制屏幕,则无法在其他位置执行此操作。
在这里,我做了一个看门狗的简单例子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | 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源代码仓库"项目中的示例
您可以选择:
-
在特定进程中监视内存
-
如果他们不返回,请终止该过程
-
检查系统中的内存使用情况,根据需要安排杀戮/重新启动。