以下消息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();
}
}
};
};
然而,即使它在AVD中测试得很好(我通过DDMS提供了一个大的KML文件),“object path = message.obj;” line有一个警告说“这个Handler类应该是静态的,否则可能会发生泄漏”。
但是,如果我说“静态处理程序处理程序=新处理程序()”它将无法编译抱怨我“无法对非静态字段myMapView进行静态引用。如果我不能进行此类引用,我可以做任何有用的事情。
这使我在这个问题上进行了几个小时的谷歌搜索,并且比我想知道的更多关于弱参考的知识。我发现经常发现的推荐是我应该替换......
private Handler handler = new Handler()
与
static class handler extends Handler
{
private final WeakReference<PSActivity> mTarget;
handler(PSActivity target)
{
mTarget = new WeakReference<PSActivity>(target);
}
但是这不会编译仍然抱怨我不能对非dtatic字段进行静态引用。所以,我一周或前一周的问题是“如何为android编写消息处理程序,以便我的服务可以将数据发送到我的活动。即使我有工作代码,问题仍然是后缀”没有泄漏内存“。 谢谢,加里
答案 0 :(得分:4)
当我尝试在服务中使用处理程序时,我收到了相同的警告消息,最后通过从this thread获取建议来解决它,请参阅我项目中的代码片段。
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);
...
}
}
答案 1 :(得分:0)
我知道我对派对来说有点晚了,但希望这有助于进一步回答未来询问者的问题。
正如你通过谷歌搜索发现的那样(我自己已经做了很多事情来解决类似的问题)你需要将你的Handler实例变成一个静态内部类(嵌套类),它在其构造函数中获取目标Activity 。然后,它将此Activity引用转换为WeakReference,这可以用于与目标Activity中的事物进行交互。在你的情况下:
Toast.makeText(mTarget.get().this, "Service Started" + path.toString(), Toast.LENGTH_LONG).show();
由于您要更改为嵌套类,因此您还需要在其run()方法中为您的Thread创建该类的实例。有关此方面的更多帮助(以及如何确保您的应用即使在配置更改后也能正常工作),请参阅this question。
希望这有帮助!