【发布时间】:2020-09-03 22:44:22
【问题描述】:
我正在开发一个 Android 项目,想知道每个 Activity 中的 Internet 连接状态,而我的应用程序有超过 15 个 Activity,所以我不想在每个 Activity 中实现和初始化我的 networkstatechanged 类和接口。 所以,我在一个扩展 Application 的类中创建了它的实例,我在其中创建了我的接口对象。
我的 NetworkStateChanged 类:
NetworkConnected.java
package time.real.identify.location.tracker.gps.saksham.com.emptrackerhost;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.ArrayList;
import java.util.List;
interface NetworkListener {
void isConnected();
void isDisconnected();
}
public class NetworkConnected {
private List<NetworkListener> listeners = new ArrayList<NetworkListener>();
private boolean isConnected = false;
private boolean wasConnected = false;
NetworkConnected() {
new Thread(new Runnable() {
@Override
public void run() {
isConnected = isOnline();
wasConnected = isConnected;
notifySomethingHappened();
while(true){
isConnected = isOnline();
if(wasConnected != isConnected){
wasConnected = isConnected;
notifySomethingHappened();
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
private boolean isOnline() {
try {
int timeoutMs = 3000;
Socket sock = new Socket();
SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53);
sock.connect(sockaddr, timeoutMs);
sock.close();
return true;
} catch (IOException e) {
return false;
}
}
void addListener(NetworkListener listener) { listeners.add(listener); }
private void notifySomethingHappened() {
for (NetworkListener listener : listeners) {
if(isConnected){
listener.isConnected();
}
else{
listener.isDisconnected();
}
}
}
}
ApplicationClass.java
package time.real.identify.location.tracker.gps.saksham.com.emptrackerhost;
import android.app.Application;
public class ApplicationClass extends Application {
public static boolean isNetworkConnected = false;
@Override
public void onCreate() {
super.onCreate();
new NetworkConnected().addListener(new time.real.identify.location.tracker.gps.saksham.com.emptrackerhost.NetworkListener() {
@Override
public void isConnected() {
isNetworkConnected = true;
}
@Override
public void isDisconnected() {
isNetworkConnected = false;
}
});
}
}
在此之后,我只想在每个类中实现一个接口,该接口不需要添加为侦听器或初始化,因为一个对象已经在运行。
我想要这样的东西:-
public class LoginPageClass extends Activity implements NetworkListener
{
public void isConnected(){
//Make a Snackbar
}
public void isDisconnected(){
//Make a Snackbar
}
}
注意:- 我不想从 ApplicationClass 调用 myNetworkListener 类的对象来添加监听器(this);
我只想获取实现我的 NetworkConnected 类的类列表,以便为它们提供状态更改回调。 可能吗?如果有,怎么做?
【问题讨论】:
-
如果你的应用有
15 activities,这意味着你需要使用fragments。使用单个Activity并在Activity上放置一个侦听器,然后在您的fragments上使用该侦听器。 -
我在大多数活动中都有片段,我想要其他解决方案。
-
然后使用
broadcast receiver。 -
您可以将通用代码移动到基础活动中,并使您的所有 15 个活动都扩展它