Dea*_*ely 1 android memory-leaks android-handler
以下消息处理程序可以很好地从我的服务接收消息...
private Handler handler = new Handler()
{
public void handleMessage(Message message)
{
Object path = message.obj;
if (message.arg1 == 5 && path != null) //5 means its a single mapleg to plot on the map
{
String myString = (String) message.obj;
Gson gson = new Gson();
MapPlot mapleg = gson.fromJson(myString, MapPlot.class);
myMapView.getOverlays().add(new DirectionPathOverlay(mapleg.fromPoint, mapleg.toPoint));
mc.animateTo(mapleg.toPoint);
}
else
{
if (message.arg1 == RESULT_OK && path != null)
{
Toast.makeText(PSActivity.this, "Service Started" + path.toString(), Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(PSActivity.this,"Service error" + String.valueOf(message.arg1), Toast.LENGTH_LONG).show();
}
}
};
};
Run Code Online (Sandbox Code Playgroud)
但是,即使它可以在AVD中正常测试(我正在通过DDMS向其提供大的KML文件),“对象路径= message.obj;” 行中有一条警告,说“此Handler类应该是静态的,否则可能会发生泄漏”。
但是,如果我说“静态处理程序处理程序= new Handler()”,则不会抱怨我“无法对非静态字段myMapView进行静态引用。如果无法进行此类引用,则无法执行”任何有用的东西。
这导致我花了几个小时在这个问题上进行了深入的研究,并且比我以前所想了解的更多地了解了弱引用。我发现的经常发现的建议是我应该更换...
private Handler handler = new Handler()
Run Code Online (Sandbox Code Playgroud)
与
static class handler extends Handler
{
private final WeakReference<PSActivity> mTarget;
handler(PSActivity target)
{
mTarget = new WeakReference<PSActivity>(target);
}
Run Code Online (Sandbox Code Playgroud)
但这仍然无法编译,仍然抱怨我无法静态引用非dtatic字段。因此,一周或更早以前,我的问题是“如何为android编写消息处理程序,以便我的服务可以将数据发送到我的活动。即使我有工作代码,问题仍然带有后缀“不泄漏内存”。谢谢,加里
当我尝试在Service中使用处理程序时,我得到了相同的警告消息,最后通过采纳该线程的建议解决了它,请参阅项目中的代码片段。
public class MyService extends Service {
...
private MyHandler mHandler;
public static class MyHandler extends Handler {
private final WeakReference<MyService> mService;
MyHandler(MyService service) {
mService = new WeakReference<MyService>(service);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
MyService service = mService.get();
if (service!=null) {
if (msg.what==MSG_RESUME_CHECKING) {
service.pause();
} else if (msg.what==MSG_PAUSE_CHECKING) {
service.resume();
}
}
}
}
...
@Override
public void onCreate() {
super.onCreate();
...
mHandler = new MyHandler(this);
...
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3392 次 |
| 最近记录: |