【问题标题】:Get a list of all the implementations of an Interface in Android获取 Android 中某个接口的所有实现的列表
【发布时间】: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 个活动都扩展它

标签: java android interface


【解决方案1】:

您可以使用 BaseActivity 作为抽象,并根据网络变化检查互联网。

  • 需要权限
<!--Manifest.xml-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  • NetworkChangeListener.java
/* Interface required to call in each activity with whom you extends BaseActivity.java */
public interface NetworkChangeListener {
    void networkAvailable();

    void networkUnavailable();
}
  • BaseActivity.java

@SuppressLint("Registered")
public abstract class BaseActivity extends AppCompatActivity implements NetworkChangeListener {

    private BroadcastReceiver networkStateReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            /* previous way of doing it*/
            NetworkInfo ni = null;
            if (manager != null) {
                ni = manager.getActiveNetworkInfo();
            }
            if (ni != null && ni.isConnected()) {
                networkAvailable();
            } else {
                networkUnavailable();
            }
        }
    };

    /*
     * If you like to check it manually you also cam use the bellow function for it
     * */

    public void checkInternet() {
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        /* previous way of doing it*/
        NetworkInfo ni = null;
        if (manager != null) {
            ni = manager.getActiveNetworkInfo();
        }
        if (ni != null && ni.isConnected())
            networkAvailable();
        else
            networkUnavailable();
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.e("NETWORK_STATE", "networkStateReceiver registerReceiver");
        registerReceiver(networkStateReceiver, new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION));
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.e("NETWORK_STATE", "networkStateReceiver unregisterReceiver");
        unregisterReceiver(networkStateReceiver);
    }
}


如果您想手动检查互联网,您可以使用


    /*
     * If you like to check it manually you also cam use the bellow function for it
     * */
    public void checkInternet() {
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        /* previous way of doing it*/
        NetworkInfo ni = null;
        if (manager != null) {
            ni = manager.getActiveNetworkInfo();
        }
        if (ni != null && ni.isConnected())
            networkAvailable();
        else
            networkUnavailable();
    }
  • MainActivity.java

public class MainActivity extends BaseActivity {

    /*
     * Check the log for the proper results
     * */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void networkAvailable() {
        Log.e("NETWORK_STATE", "Connected");
    }

    @Override
    public void networkUnavailable() {
        Log.e("NETWORK_STATE", "Not Connected");
    }
}

另外,如果有什么遗漏,请参考Github repo

【讨论】:

  • 感谢您提供完整的代码。我将能够使用我的代码来检测互联网。连接管理器不会通过连接的设备判断 Internet 是否可用。
  • @saksham 您可以访问github.com/BagwanAkib/NetworkApplication 以获得更多帮助,我根据您的评论更新了用例。因为您需要单个对象来帮助管理状态更改,希望对您有所帮助
【解决方案2】:

当然在 Java 上你不能扩展两个类,所以你可以创建一个扩展类 Activity 的新类 BaseAcivity 并在这个类 (BaseActivity) 上的 NetworkConnected 上完成工作,并将它扩展到你的活动而不是类活动。

【讨论】:

  • 我得到了你的答案,但我有点困惑。不会多次扩展同一个类会导致它多次实例化。我只希望我的网络侦听器一次运行一个实例,因为它会导致不必要的网络使用。谢谢
猜你喜欢
  • 2019-07-25
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 2011-08-16
相关资源
最近更新 更多