【发布时间】: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