如何继承类方法并在Activity中调用?网络检测代码分离遇阻
解决你的两个Android开发问题
一、先搞定网络检测逻辑抽离的问题
你遇到的核心问题是InternetChecker类里没法直接调用findViewById和使用Snackbar,因为这些都依赖Activity的上下文和视图环境。咱们可以通过传递依赖项的方式来解决:
1. 重构InternetChecker类
把上下文和需要显示Snackbar的根View通过构造方法传进去,让工具类不再绑定具体的Activity:
public class InternetChecker { private final Context mContext; private final View mRootView; // 构造方法传入上下文和根View public InternetChecker(Context context, View rootView) { this.mContext = context; this.mRootView = rootView; } // 封装网络连接判断逻辑,需要上下文获取系统服务 private boolean isConnected() { ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); return activeNetwork != null && activeNetwork.isConnectedOrConnecting(); } public void checkNet() { if (isConnected()) { Snackbar.make(mRootView, "Your Internet Connection is Great", Snackbar.LENGTH_LONG).show(); } else { Snackbar.make(mRootView, "No Internet Connection", Snackbar.LENGTH_LONG).show(); } } }
2. 在LoginActivity中调用
在你的LoginActivity里,获取根View后实例化工具类即可:
// 比如在onCreate方法或者点击事件中 View loginRootView = findViewById(R.id.activity_login); InternetChecker netChecker = new InternetChecker(this, loginRootView); netChecker.checkNet();
注意事项
别忘了在AndroidManifest.xml中添加网络状态权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
二、关于继承类方法并在另一个Activity使用
如果是想让多个Activity复用同一个方法,最常用的方式是创建BaseActivity基类,让其他Activity继承它:
1. 编写BaseActivity基类
把通用方法放到基类里,注意访问修饰符用protected,这样子类可以直接访问:
public class BaseActivity extends AppCompatActivity { // 通用网络检测方法 protected boolean isNetworkConnected() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); return activeNetwork != null && activeNetwork.isConnectedOrConnecting(); } // 你还可以加其他通用方法,比如Toast提示 protected void showShortToast(String msg) { Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); } }
2. 让目标Activity继承BaseActivity
比如你的MainActivity,直接继承BaseActivity后就能调用基类的方法:
public class MainActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 直接调用基类的方法 if (isNetworkConnected()) { showShortToast("网络连接正常"); } else { showShortToast("请检查网络"); } } }
两种方案的选择
- 如果是多个Activity都需要的通用逻辑,用基类继承更方便;
- 如果只是某几个场景需要,或者不想让Activity继承链太复杂,用**工具类(比如InternetChecker)**更灵活。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

