我有两个应用。一个是收藏家,另一个是 Uplaoder 。收集器收集一些数据,并通过广播发送到上载器,然后上载到服务器。 现在的问题是,有时Collector将广播发送给Uplaoder时,广播超时并抛出ANR。 我已经在我的Uploader应用程序中检查到没有正在进行的繁重工作,这会影响超时。它只是启动了服务而已。
这是Uplaoder广播接收者
public class DataReceiver extends BroadcastReceiver {
private static final String TAG = DataReceiver.class.getSimpleName();
@Override
public void onReceive(Context context, Intent intent) {
AndroidApplication application = (AndroidApplication) context.getApplicationContext();
if (BuildVersionsHelper.isBuildVersionMAndAbove()) {
if (!application.isSystemUser()) {
return;
}
}
Log.d(TAG, "Event upload request through DataReceiver");
JobIntentService.enqueueWork(context, SimpleInterfaceReceiverService.class,
Constants.SIMPLE_INTERFACE_JOB, intent);
}}
添加广播接收器的清单
<receiver android:name=".intentreceiver.DataReceiver">
<intent-filter>
<action android:name="com.symbol.dataanalytics.TRANSPORT_INTENT" />
</intent-filter>
</receiver>
发送广播的收藏家代码
Bundle eventBundle = new Bundle();
Intent intent = new Intent(EVENT_ACTION);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(TIMESTAMP, String.valueOf(System.currentTimeMillis()));
intent.putExtra(DATA, eventBundle);
intent.putExtra(TYPE, eventName);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setData(null);
intent.setPackage("com.xxx.Uploader");
intent.setAction("com.xxx.xxx.TRANSPORT_INTENT");
sendBroadcast(intent);
现在这些超时是警告,但是为什么这些超时在应用程序中显示ANR?
答案 0 :(得分:0)
我已经找到了根本原因。
这里的原因是Collector应用在主线程上做过多的工作,这在日志中很明显。由于收集器应用程序,我可以看到CPU负载为11%。
现在同时 Collector 应用尝试将广播发送到 Uploader 应用。由于 Collector 在CPU上的运行情况比预期的Android操作系统要严重得多,因此 Collector发送到Uploader 的广播被延迟或无法到达目的地。现在,由于尚未在接收器应用程序上提高ANR(即 Uploader ),OS认为还没有从onRecieve推测的时间返回广播,因此广播还没有恢复10秒。
注意:即使发送方存在一些问题,我仍然不确定在接收方提高ANR的理论。如果我错了,请纠正我。