2012-10-21 61 views
1

因此,着名的月球着陸器示例給出了一個錯誤:處理程序類和內存泄漏

此處理程序類應該是靜態的或可能發生泄漏!

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

問題是什麼?這更像是一篇博文,而不是一個真正的問題。 –

+0

[此Handler類應該是靜態的或可能發生泄漏:IncomingHandler]的可能的重複(http://stackoverflow.com/questions/11407943/this-handler-class-should-be-static-or-leaks-might-occur -incominghandler) –

回答

0

就像它說的那樣。 Handler類應該是靜態的

因此,如果你定義Handler,你會定義一個內部類,具有WeakReference對上下文:如果您使用context變量

thread = new LunarThread(holder, context, new StaticHandler(this)); 

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")); 
    } 
} 

,然後調用這個在那個StaticHandler中,那麼你必須調用WeakReference來獲取上下文:

MyActivity activity = reference.get(); 

防止泄漏。

我不知道代碼的其餘部分是怎麼樣的,但是您可能需要將不同的參數傳遞給StaticHandler類。

+0

正如我所說我在Android上很新,所以我不能理解我必須把這個靜態類放在哪裏。我在月球觀中。如果我把這個代碼代替原來的代碼,我有很多錯誤。這是官方的月球登陸器例子!! – user1739462

+0

嗯,也許你應該是一個更有能力的程序員,然後再解決實際的Android代碼;)無論如何,你可以忽略這個錯誤。但我的回答仍然正確 – tolgap

+0

謝謝你的答案。我只是在使用活動和意見之間存在疑問。我嘗試過,它的工作原理。我認爲這可能對像我這樣的其他新手有用! – user1739462

1

因此,解決辦法:(感謝誰answare我)

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")); 
    } 
}; 

在lunarview類的結尾!然後修改該呼叫:

thread = new LunarThread(holder, context, new InvalidateHandler(this)); 

正如剛纔所示!並且警告消失了!

謝謝大家! (我也是) !!