因此,着名的月球着陆器示例会出错:
此处理程序类应该是静态的,否则可能会发生泄漏!
public LunarView(final Context context, final AttributeSet attrs) {
super(context, attrs);
// register our interest in hearing about changes to our surface
final SurfaceHolder holder = getHolder();
holder.addCallback(this);
// create thread only; it's started in surfaceCreated()
//这里的问题
thread = new LunarThread(holder, context, new Handler() {
@Override
public void handleMessage(final Message m) {
mStatusText.setVisibility(m.getData().getInt("viz"));
mStatusText.setText(m.getData().getString("text"));
}
});
我是Android的新手,无法找到任何解决方案。我“尝试”使用Android API 15。
答案 0 :(得分:1)
所以解决方案:(谢谢谁回复我)
private static class InvalidateHandler extends Handler {
public InvalidateHandler(LunarView view){
new WeakReference<LunarView>(view);
}
@Override
public void handleMessage(final Message m) {
mStatusText.setVisibility(m.getData().getInt("viz"));
mStatusText.setText(m.getData().getString("text"));
}
};
在农历班结束时!!然后修改通话:
thread = new LunarThread(holder, context, new InvalidateHandler(this));
刚刚建议!!警告已经消失了!!
全部谢谢!! (我也是)!!
答案 1 :(得分:0)
就像它说的那样。 Handler类应该是静态的。
因此,如果您定义Handler
,就像定义内部类一样,并在上下文中使用WeakReference
:
static class StaticHandler() {
WeakReference<MyActivity> reference;
public StaticHandler(MyActivity activity) {
reference = new WeakReference<MyActivity>(activity);
}
@Override
public void handleMessage(final Message m) {
mStatusText.setVisibility(m.getData().getInt("viz"));
mStatusText.setText(m.getData().getString("text"));
}
}
然后调用它:
thread = new LunarThread(holder, context, new StaticHandler(this));
如果您在StaticHandler中使用context
变量,则必须调用WeakReference
来获取上下文:
MyActivity activity = reference.get();
阻止它泄漏。
我不知道代码的其余部分如何,但您可能必须将另一个参数传递给StaticHandler
类。