2012-07-15 51 views
1

因此,顯然Handlers應聲明爲靜態或他們可以泄漏他們的外部類(以及應用程序上下文一起)。這顯然限制了你可以用Handler做什麼,我想知道我想要做什麼實際上是可能的。看看這段代碼:如何將靜態處理程序與服務/活動一起使用?

public class MyService extends Service { 

    private int counter; 

    private static final Handler handler = new Handler() { 

     @Override 
     public void handleMessage(Message msg) { 
      // Increment counter here 
     } 

    }; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     counter = 0; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     handler.sendEmptyMessage(0); 
     return Service.START_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 

} 

靜態處理程序不能撐到服務的引用,因此一個簡單的counter++handleMessage()是行不通的。有沒有辦法檢查服務是否正在運行並獲取對它的引用?

+1

請參閱http://stackoverflow.com/questions/11407943/this-handler-class-should-be-static-or-leaks-might-occur-incominghandler – biegleux 2012-07-15 16:59:49

回答

2

您可以使用WeakReference來防止您的服務泄漏。但實際上你代碼中的Handler看起來多餘。從UI線程調用onCreateonStartCommand,這樣就可以安全地增加counter而無需額外的同步。

如果您確實需要從不同線索訪問counter,請使用AtomicInteger而不是int。這將比使用Handler更簡單,你將獲得更多的性能。

+0

謝謝,我給出的代碼是一個簡化版本我的問題。實際上,Handler處理來自工作線程的回調,所以我不知道什麼時候應該更新Integer,但AtomicInteger似乎優雅地解決了這個問題,非常感謝。 – 2012-07-15 18:48:09

+0

不客氣! – 2012-07-15 19:11:05

相關問題