簡體   English   中英

廣播接收器和內存泄漏

[英]Broadcast receiver and memory leaks

在我的應用中; 我想在所有服務中接收網絡連接更改,因為我必須同時在本地和服務器上管理數據庫。

我已經制作了BaseConnectivityService ,它具有如下接收器,用於進行連接更改:

public abstract class BaseConnectivityService extends IntentService {

    private ConnectivityManager mConnectivityManager;

    public BaseConnectivityService(String name) {
        super(name);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mConnectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
        registerReceivers();
    }

    @Override
    public void onDestroy() {
        unregisterReceivers();
        mConnectivityManager = null;
        super.onDestroy();
    }

    private void registerReceivers() {
        IntentFilter connectivityIntentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(mConnectivityChangeReceiver, connectivityIntentFilter);
    }

    private void unregisterReceivers() {
        unregisterReceiver(mConnectivityChangeReceiver);
    }

    /**
     * will be invoked when network connectivity has been changed and network is in connected state
     */
    protected abstract void onNetworkConnected();

    /**
     * will be invoked when network connectivity has been changed and network is NOT in connected state
     */
    protected abstract void onNetworkDisconnected();

    /**
     * checks whether network is available and is in connected state
     *
     * @return true if network is connected; false otherwise
     */
    protected final boolean isNetworkConnected() {
        NetworkInfo activeNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null && activeNetworkInfo.isAvailable() && activeNetworkInfo.isConnected();
    }


    private final BroadcastReceiver mConnectivityChangeReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (isNetworkConnected()) {
                onNetworkConnected();
            } else {
                onNetworkDisconnected();
            }
        }
    };
}

現在,如果我使用BaseConnectivityService擴展所有服務; 它會導致內存泄漏,因為該系統會將服務保留在內存中以通知連接更改嗎?

我已經閱讀了這個主題 ; 這有點類似的問題。 正如馬克·墨菲(Mark Murphy)在那寫的那樣:

您將泄漏內存,因為BroadcastReceiver會將組件保留在RAM中(即使它已銷毀),直到Android終止進程為止。

它適用於我的情況嗎? 如果是,那么什么是避免內存泄漏並獲得網絡連接更改通知的好的解決方案?

查看同一線程中的最后一個響應。 您可以從Service類注冊和注銷廣播接收器。 如果它與服務生命周期綁定在一起,則沒有泄漏的機會。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM