通知网络变更的活动 - Android电子 [英] Notify Activity of Network Change - Android
本文介绍了通知网络变更的活动 - Android电子的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有需要执行一次到网络的连接已经建立的操作的活动。我试图实现Observer模式,但我得到一个NullPointerException异常,当我尝试注册的观察活动的主题。有什么想法?
NetworkStatus
公共类NetworkStatus实现NetworkStatusSubject,Runnable接口{ 清单< NetworkObserver> observerList;
上下文语境;
公共NetworkStatus(上下文的背景下){
this.context =背景;
} 公共静态布尔isConnectedToInternet(上下文的背景下){ 布尔haveConnectedWifi = FALSE;
布尔haveConnectedMobile = FALSE; ConnectivityManager厘米=(ConnectivityManager)context.getSystemService(context.CONNECTIVITY_SERVICE);
的NetworkInfo [] = NetInfo的cm.getAllNetworkInfo();
对于(NI的NetworkInfo:NetInfo的){
如果(ni.getTypeName()。equalsIgnoreCase(WIFI))
如果(ni.isConnected())
haveConnectedWifi = TRUE;
如果(ni.getTypeName()。equalsIgnoreCase(手机))
如果(ni.isConnected())
haveConnectedMobile = TRUE;
}
返回haveConnectedWifi || haveConnectedMobile;
} / **
*添加观察员名单
* /
@覆盖
公共无效的addObserver(NetworkObserver O){
observerList.add(O); } / **
*从列表中删除观察
* /
@覆盖
公共无效removeObserver(NetworkObserver O){
observerList.remove(O);
} @覆盖
公共无效notifyObservers(){
对于(NetworkObserver networkObserver:observerList){
networkObserver.updateStatus();
}
} @覆盖
公共无效的run(){ 而(真){
Log.d(NetworkStatus,检查网络状态);
如果(isConnectedToInternet(上下文)){
notifyObservers();
Log.d(NetworkStatus,建立网络连接);
}
其他{
Log.d(NetworkStatus,未连接到网络);
}
尝试{
视频下载(10000);
}赶上(InterruptedException的E){
// TODO自动生成catch块
e.printStackTrace();
}
} }
}
活动,需要通知
公共类OfflineActivity扩展活动实现NetworkObserver { 公众的GeoPoint ourLocationGeoPoint; @覆盖
保护无效的onCreate(捆绑savedInstanceState){
// TODO自动生成方法存根
super.onCreate(savedInstanceState);
的setContentView(R.layout.offline_mode_layout); //注册网络状态更新
NetworkStatus networkStatus =新NetworkStatus(本);
networkStatus.addObserver(新OfflineActivity());
networkStatus.run(); //获取对系统的位置管理的参考
的LocationManager的LocationManager =(的LocationManager)本
.getSystemService(Context.LOCATION_SERVICE); //定义,响应位置更新的监听器
LocationListener的LocationListener的=新LocationListener的(){ 公共无效onLocationChanged(地点){
//当一个新的位置由网络位置发现被叫
//提供商。
/ **
*保存位置来的GeoPoint
* /
INT纬度=(INT)(location.getLatitude()* 1E6);
INT LNG =(INT)(location.getLongitude()* 1E6);
ourLocationGeoPoint =新的GeoPoint(纬度,经度);
} 公共无效onStatusChanged(字符串提供商,INT状态,
捆绑演员){
} 公共无效onProviderEnabled(字符串提供商){
} 公共无效onProviderDisabled(字符串提供商){
}
};
对于(字符串提供商:locationManager.getAllProviders()){
//注册的位置管理器监听接收
//位置更新
locationManager.requestLocationUpdates(提供商,0,0,
LocationListener的);
}
}
@覆盖
公共无效updateStatus(){ Log.d(OfflineActivity,已建立连接,上传分数!); }
}
解决方案
observerList
被声明为实例变量,但从来没有实例化。
实例化,构造函数是一个很好的地方:
公共NetworkStatus(上下文的背景下){
this.context =背景;
observerList =新的List< NetworkObserver> ();
}
I have an activity which needs to perform an operation once a connection to a network has been established. I tried implementing the Observer pattern but am getting a NullPointerException when I try to register the Observer activity to the subject. Any thoughts?
NetworkStatus
public class NetworkStatus implements NetworkStatusSubject, Runnable {
List<NetworkObserver> observerList;
Context context;
public NetworkStatus(Context context) {
this.context = context;
}
public static boolean isConnectedToInternet(Context context) {
boolean haveConnectedWifi = false;
boolean haveConnectedMobile = false;
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(context.CONNECTIVITY_SERVICE);
NetworkInfo[] netInfo = cm.getAllNetworkInfo();
for (NetworkInfo ni : netInfo) {
if (ni.getTypeName().equalsIgnoreCase("WIFI"))
if (ni.isConnected())
haveConnectedWifi = true;
if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
if (ni.isConnected())
haveConnectedMobile = true;
}
return haveConnectedWifi || haveConnectedMobile;
}
/**
* Add observer to list
*/
@Override
public void addObserver(NetworkObserver o) {
observerList.add(o);
}
/**
* Remove Observer from list
*/
@Override
public void removeObserver(NetworkObserver o) {
observerList.remove(o);
}
@Override
public void notifyObservers() {
for(NetworkObserver networkObserver : observerList) {
networkObserver.updateStatus();
}
}
@Override
public void run() {
while(true) {
Log.d("NetworkStatus", "Checking Network Status");
if(isConnectedToInternet(context)){
notifyObservers();
Log.d("NetworkStatus", "Network Connection is established");
}
else {
Log.d("NetworkStatus", "Not connected to network");
}
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Activity which needs notification
public class OfflineActivity extends Activity implements NetworkObserver {
public GeoPoint ourLocationGeoPoint;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.offline_mode_layout);
//Register for network status updates
NetworkStatus networkStatus = new NetworkStatus(this);
networkStatus.addObserver(new OfflineActivity());
networkStatus.run();
// Acquire a reference to the system Location Manager
LocationManager locationManager = (LocationManager) this
.getSystemService(Context.LOCATION_SERVICE);
// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
// Called when a new location is found by the network location
// provider.
/**
* Save Location to geopoint
*/
int lat = (int) (location.getLatitude() * 1E6);
int lng = (int) (location.getLongitude() * 1E6);
ourLocationGeoPoint = new GeoPoint(lat, lng);
}
public void onStatusChanged(String provider, int status,
Bundle extras) {
}
public void onProviderEnabled(String provider) {
}
public void onProviderDisabled(String provider) {
}
};
for (String provider : locationManager.getAllProviders()) {
// Register the listener with the Location Manager to receive
// location updates
locationManager.requestLocationUpdates(provider, 0, 0,
locationListener);
}
}
@Override
public void updateStatus() {
Log.d("OfflineActivity", "Connection Established, Uploading Points!");
}
}
解决方案
observerList
is declared as an instance variable but never instantiated.
Instantiate it, the constructor is a good place for this:
public NetworkStatus(Context context) {
this.context = context;
observerList = new List <NetworkObserver> ();
}
这篇关于通知网络变更的活动 - Android电子的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文