【问题标题】:Can I store a static instance of an Activity or Fragment within itself?我可以在其中存储 Activity 或 Fragment 的静态实例吗?
【发布时间】:2018-03-15 06:42:42
【问题描述】:

我需要更新基于广播接收器的 UI 元素。自我引用存储自己创建的最后一个实例以将更新发送到有什么问题吗?

public class ExampleFragment extends Fragment {

    private static ExampleFragment sExampleFragment = null; 
    private BroadcastReceiver mNetworkReceiver;    
    private TextView networkStateTextView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        sExampleFragment = this;
        mNetworkReceiver = new NetworkChangeReceiver();
        registerNetworkBroadcast();        
    }

    public void updateTextView(Boolean value) {
        networkStateTextView.setText(String.valueOf(value));
    }

    public static void setNetworkConnectedState(boolean value){        
        sExampleFragment.updateTextView(value);
    }

    private void registerNetworkBroadcast() {
        getContext().registerReceiver(mNetworkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
    }

    protected void unregisterNetworkChanges() {
        try {
            getContext().unregisterReceiver(mNetworkReceiver);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
    }
}

我的广播接收器:

public class NetworkChangeReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, final Intent intent) {
        try
        {
            Log.d("Network Available ", String.valueOf(isOnline(context)));
            ExampleFragment.setNetworkConnectedState(isOnline(context));
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
    }

    private boolean isOnline(Context context) {
        try {
            ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            //should check null because in airplane mode it will be null
            return (netInfo != null && netInfo.isConnected());
        } catch (NullPointerException e) {
            e.printStackTrace();
            return false;
        }
    }
}

有没有办法在不污染我的 Fragment 的情况下使用静态成员?

【问题讨论】:

  • 不要静态持有Context会导致内存泄漏。
  • 你能把完整的代码贴在这里吗
  • @ADM 最多只有 1 个上下文副本。对吗?
  • BroadcastReceiver 是一个组件,因此它已经具有 Context 。使用sendBroadcast() 通知不要使用公共方法。
  • 糟糕的设计。内存泄漏。 BroadcastReceiver 是你的朋友。

标签: java android static broadcastreceiver


【解决方案1】:
        // Monitor network changed events
        mNetworkReceiver = new NetworkChangeReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {

                try
                {
                    Log.d("Network Available ", String.valueOf(isOnline(context)));
                    ///networkChanged(isOnline(context));

                    if(isOnline(context)){
                        connectedImageView.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.ic_connected_yes));
                        connectedTextView.setText(R.string.connected_yes);
                    }else{
                        connectedImageView.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.ic_connected_no));
                        connectedTextView.setText(R.string.connected_no);
                    }

                } catch (NullPointerException e) {
                    e.printStackTrace();
                }
            }
        };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 2011-10-28
    • 2018-07-10
    • 2013-08-20
    • 2013-08-24
    相关资源
    最近更新 更多