Android使用观察者模式Observer实现网络状态监听

在现代移动应用开发中,网络连接状态的监控至关重要,无论是上传数据、下载文件还是实时通讯,网络状态的变化直接影响到应用程序的用户体验和功能完整性,为了高效地处理网络状态变化,Android开发者常常采用观察者模式(Observer Pattern)来实现这一目标,本文将详细介绍如何在Android中使用观察者模式来监听网络状态变化。
观察者模式简介
观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新,在观察者模式中,通常有两个主要角色:
1、Subject(主题/被观察者):维护一组观察者,并在其状态发生变化时通知这些观察者。
2、Observer(观察者):订阅主题的通知,并在收到通知时进行相应的处理。
在Android中,ConnectivityManager和NetworkCallback类提供了一种方便的方式来实现这种模式,用于监听网络状态的变化。
准备工作
权限声明
需要在项目的AndroidManifest.xml文件中声明必要的权限,以便应用能够访问网络状态信息。

<manifest ...>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
引入必要的库
确保在build.gradle文件中包含以下依赖项:
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'androidx.core:core-ktx:1.6.0'
implementation 'com.google.android.material:material:1.4.0'
}
实现步骤
1. 创建Observable(被观察者)
在Android中,我们使用ConnectivityManager来获取当前的网络状态,并通过注册NetworkCallback来监听网络状态的变化。
创建Observer(观察者)
我们需要创建一个观察者类,该类实现了NetworkCallback接口,并在网络状态变化时执行相应的操作。
注册观察者
将观察者注册到ConnectivityManager中,使其开始监听网络状态的变化。
解除注册
在适当的时候(如Activity或Fragment销毁时),需要解除观察者的注册以释放资源。
代码实现

1. 创建Observable(被观察者)
Android系统已经为我们提供了一个现成的ConnectivityManager来管理网络状态,我们只需要获取它的实例即可。
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.os.Build;
import androidx.annotation.RequiresApi;
public class NetworkStateMonitor {
private final ConnectivityManager connectivityManager;
private NetworkCallback networkCallback;
public NetworkStateMonitor(Context context) {
this.connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
initializeNetworkCallback();
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void initializeNetworkCallback() {
networkCallback = new NetworkCallback() {
@Override
public void onAvailable(Network network) {
// 网络可用时的处理逻辑
notifyObservers();
}
@Override
public void onLost(Network network) {
// 网络不可用时的处理逻辑
notifyObservers();
}
};
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void startMonitoring() {
NetworkRequest request = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.build();
connectivityManager.registerNetworkCallback(request, networkCallback);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void stopMonitoring() {
connectivityManager.unregisterNetworkCallback(networkCallback);
}
private void notifyObservers() {
// 通知所有观察者网络状态发生了变化
// 这里可以调用观察者的update方法或者通过其他方式通知观察者
}
}
创建Observer(观察者)
我们需要创建一个观察者类,该类实现了NetworkCallback接口,并在网络状态变化时执行相应的操作,我们可以在网络可用时启动某些服务,在网络不可用时暂停这些服务。
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.os.Build;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements NetworkStateMonitor.Observer {
private NetworkStateMonitor networkStateMonitor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
networkStateMonitor = new NetworkStateMonitor(this);
networkStateMonitor.startMonitoring();
}
@Override
protected void onDestroy() {
super.onDestroy();
networkStateMonitor.stopMonitoring();
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void update(Network network, boolean isConnected) {
if (isConnected) {
Toast.makeText(this, "网络已连接", Toast.LENGTH_SHORT).show();
// 执行网络可用时的操作,如启动后台任务等
} else {
Toast.makeText(this, "网络已断开", Toast.LENGTH_SHORT).show();
// 执行网络不可用时的操作,如暂停后台任务等
}
}
}
注册观察者
在Activity或Fragment的onCreate方法中,我们将观察者注册到ConnectivityManager中,使其开始监听网络状态的变化,这一步已经在上面的代码中完成。
解除注册
在Activity或Fragment销毁时,我们需要解除观察者的注册以释放资源,这一步也在上面的代码中通过调用stopMonitoring方法完成。
通过上述步骤,我们成功地在Android应用中使用观察者模式实现了网络状态的监听,这种方法不仅结构清晰,而且易于扩展和维护,开发者可以根据实际需求进一步优化和完善网络状态监听的逻辑,例如添加更多的网络类型支持、处理不同的网络变化事件等,希望本文对您有所帮助!