Android Wearable.DataApi.putDataItem(GoogleAppClient,PutDataRequest)在工作线程中使用时泄漏
我正在使用重复执行的任务在我的可穿戴设备和手持设备之间同步数据。因此,将启动一个启动可运行的服务。在其run()方法中,将创建PutDataRequest并通过Android Wearable.DataApi.putDataItem(GoogleAppClient,PutDataRequest)在工作线程中使用时泄漏,android,multithreading,memory-leaks,google-api,wear-os,Android,Multithreading,Memory Leaks,Google Api,Wear Os,我正在使用重复执行的任务在我的可穿戴设备和手持设备之间同步数据。因此,将启动一个启动可运行的服务。在其run()方法中,将创建PutDataRequest并通过 Wearable.DataApi.putDataItem(googleApiClient, putDataRequest); 之后,通过postdayed()方法调度该任务的新运行 虽然一切正常,但行: Wearable.DataApi.putDataItem(googleApiClient, putDataRequest);
Wearable.DataApi.putDataItem(googleApiClient, putDataRequest);
之后,通过postdayed()方法调度该任务的新运行
虽然一切正常,但行:
Wearable.DataApi.putDataItem(googleApiClient, putDataRequest);
不知怎的泄露,一段时间后应用程序崩溃。有人知道为什么吗?或者这是Api的一个bug
我的Runnable代码如下:
private static class WeakRunnable implements Runnable{
private WeakReference<WearManagerWearable> weakWearManager;
private WeakReference<HashMap<Integer,MySensorEventListeners>> weakListenerList;
private WeakReference<Handler> weakHandler;
protected WeakRunnable(WearManagerWearable wearManager, HashMap<Integer,MySensorEventListeners> listenerList , Handler handler ){
weakWearManager = new WeakReference<>(wearManager);
weakListenerList = new WeakReference<>(listenerList);
weakHandler = new WeakReference<>(handler);
}
@Override
public void run() {
WearManagerWearable wearManager = weakWearManager.get();
GoogleApiClient googleApiClient = wearManager.googleApiClient;
HashMap<Integer,MySensorEventListeners> listenerList = weakListenerList.get();
if(wearManager.isApiConnected()) {
ArrayList<DataMap> dataMapArrayList = new ArrayList<DataMap>();
for (MySensorEventListeners listener : listenerList.values()) {
DataMap dataMap = new DataMap();
dataMap.putString("Name" , listener.getName() );
dataMap.putInt("Type" , listener.getType());
dataMap.putFloatArray("Data" , listener.getData());
dataMapArrayList.add(dataMap);
}
PutDataMapRequest putDataMapRequest = PutDataMapRequest.create("/sensorData");
putDataMapRequest.getDataMap().putDataMapArrayList("DataMapList", dataMapArrayList);
PutDataRequest putDataRequest = putDataMapRequest.asPutDataRequest();
//send
Wearable.DataApi.putDataItem(googleApiClient, putDataRequest); // this line leaks (when commented out no leaks)
Log.d("Wearable", "Data sending");
}
Handler handler = weakHandler.get();
handler.postDelayed(this, updateTime);
}
}
私有静态类WeakRunnable实现可运行{
私人WeakReference weakWearManager;
私人WeakReference weakListenerList;
私人WeakReference weakHandler;
受保护的WeakRunnable(WearManagerWearManager、HashMap listenerList、处理程序){
weakWearManager=新WeakReference(wearManager);
weakListenerList=新的WeakReference(listenerList);
weakHandler=新的WeakReference(处理程序);
}
@凌驾
公开募捐{
WearManagerWearManager=weakWearManager.get();
GoogleAppClient GoogleAppClient=wearManager.GoogleAppClient;
HashMap listenerList=weakListenerList.get();
如果(wearManager.isApiConnected()){
ArrayList dataMapArrayList=新建ArrayList();
for(MySensorEventListeners侦听器:listenerList.values()){
DataMap DataMap=新的DataMap();
putString(“Name”,listener.getName());
dataMap.putInt(“Type”,listener.getType());
putFloatArray(“Data”,listener.getData());
添加(dataMap);
}
PutDataMapRequest PutDataMapRequest=PutDataMapRequest.create(“/sensorData”);
putDataMapRequest.getDataMap().putDataMapArrayList(“DataMapList”,dataMapArrayList);
PutDataRequest PutDataRequest=putDataMapRequest.asPutDataRequest();
//发送
Wearable.DataApi.putDataItem(GoogleAppClient,putDataRequest);//此行泄漏(注释为无泄漏时)
Log.d(“可穿戴”、“数据发送”);
}
Handler=weakHandler.get();
postdayed(这是updateTime);
}
}
你认为它为什么会泄漏?我用Android Studio内存分析器对它进行了分析。堆随着时间增长,GC不再清理分配的内存。然后我跟踪到那一行,当我注释它时,没有泄漏发生。当使用弱引用时,你应该检查你的引用是否为空。应用程序运行一段时间后,weakWearManager.get()可能返回null。应用程序崩溃时是否有堆栈跟踪?