我有一个长时间运行Service
,它运行正常,但是,几个小时后,它停止响应(它似乎正在执行,但事实并非如此)。我希望找出原因/方法。
故障/错误永远不会“在电缆上”发生,因此在本地桌面计算机上进行调试不起作用。
我还将日志写入磁盘,以便遵循Service
的“流程”,但没有发生故障(MyService
网络工作,至少每20秒一次,但可能是更多)
我有一个扎根的Android设备。
在此设备中,我使用Wifi(IEE802.11)与ESP8266进行通信。
为此,我有一个无限期运行的服务。我有“开始”和“停止”动作来控制它。它由以下内容启动和停止:
MainActivity:
MyServices mMyServices = null;
boolean mIsBound = false;
onCreate(){
Intent myIntent = new Intent(this, MyServices.class);
startService(myIntent);
bindService(
myIntent,
myServiceConnection,
Context.BIND_AUTO_CREATE
);
}
onDestroy(){
unbindService(myServiceConnection);
stopService(new Intent(this, MyServices.class));
}
private final ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MyServices.MyBinder binder = (MyServices.MyBinder) service;
mMyServices = binder.getService();
mIsBound = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
mIsBound = false;
}
};
MyService
超过3k行,它本身没有阻止操作,但保持Thread
,它们似乎工作正常,即使MyService
停止响应“约束活动”。
为MyService:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return Service.START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
private final IBinder mBinder = new MyBinder();
public class MyBinder extends Binder {
public MyServices getService() {
return MyServices.this;
}
}
据我所知,当“bug”发生时,就是当我绑定一个Activity
(几个可能会被绑定一次),然后转到后台,几个小时之后,当一个“绑定” “不在前台的活动”进入前台,没有任何反应,没有日志,没有错误,应用程序只是挂起,并且出现ANR(应用程序无响应)消息,并提示终止应用程序。
我确实意识到服务“崩溃”,其线程和其他部分将继续正常工作。似乎服务对象上没有代码运行,写入磁盘的尝试从未成功。 通过电缆进行调试并没有对1 mb以上的日志提供任何有用的信息......
我正试图通过Wifi adb监控设备。一旦完成,将发布结果
答案 0 :(得分:1)
ANR发生在" main"线。这是事件循环线程,如果它很忙, Android无法处理任何其他事件,因此会抛出一个ANR对话框。
要确定代码的哪一部分阻塞主线程,可以拉出traces.txt 在每个线程状态&堆栈跟踪详细信息。
adb pull /data/anr/traces.txt
如何避免ANR
https://developer.android.com/training/articles/perf-anr.html
下面的工具也可以帮助追踪它。
Systrace
https://developer.android.com/studio/profile/systrace-commandline.html
TraceView
https://developer.android.com/studio/profile/traceview.html
Anr追踪:
答案 1 :(得分:-1)
我建议您创建一个文本文件,其中包含所需消息的日志,以尝试找到崩溃的位置,或者甚至在可能的情况下编写异常输出。检查this thread,其中有人提到如何编写文本文件Log,然后使用它在正在运行的服务中编写检查点。它不是最终解决方案或调试,但在许多情况下,日志记录有所帮助。
希望它有所帮助!
答案 2 :(得分:-1)
MainActivity在销毁时会停止服务。只需在onDestroy中取消绑定即可使服务继续运行。请看一下这个example。该示例还建议使用onStart和onStop而不是onCreate和onDestroy来绑定和取消绑定您的服务。