在MVVM中,检查互联网连接的最佳位置在哪里?

6
我有一个名为apiClass的类,它进行所有的网络调用。我想我的选择如下:
  1. activity/fragment中进行检查。

  2. apiClient类中进行检查。

我相信有更好的选择。
编辑 这个答案建议采用我的第二个选项。是否有更好的方法?
3个回答

2

您可以在任何地方添加互联网连接的方法,但根据我的理解,为了代码/方法重用,您可以创建Util类或将其添加到Application类中。您也可以参考下面的方法。

public static boolean getConnectionStatus(Context context) {
    ConnectivityManager mConnectivityManager;
    NetworkInfo mNetworkInfoMobile, mNetworkInfoWifi;

    mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    mNetworkInfoMobile = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    mNetworkInfoWifi = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    try {
        if (mNetworkInfoMobile.isConnected()) {
            App.connectivityStatus = 1;

            return true;
        }
    } catch (Exception exception) {
        // exception.printStackTrace();
    }

    if (mNetworkInfoWifi.isConnected()) {
        App.connectivityStatus = 1;

        return true;
    } else {
        App.connectivityStatus = 0;
        return false;
    }
}

1
MVVM设计模式,您可以按照以下链接进行了解:https://barta.me/android-mvvm-pattern/https://medium.com/upday-devs/android-architecture-patterns-part-3-model-view-viewmodel-e7eeee76b73b - samit
这应该在服务层中实现,因为ViewModel不应关心您是否连接,除了显示一个图标。它也不应该是静态方法。 - Nick Turner
问题不在于在哪里定义方法,而在于在哪里使用它。 - Hussein Yaqoobi

1
创建 LiveData 中的连接管理器类。
class Connectivity_check_internet(val context: Context) : LiveData<Boolean>() {
    val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    var Connnectserver: Boolean? = false
    val reciveconnctivitymanager = object : BroadcastReceiver() {
        override fun onReceive(p0: Context?, p1: Intent?) {
            Connnectserver=false
            UnpdateConnection()
            postValue(Connnectserver)
        }
    }
    init {
        UnpdateConnection()
    }

    fun UnpdateConnection(){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            val capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
            capabilities?.run {
                Connnectserver=capabilities!!.hasTransport(TRANSPORT_CELLULAR) || capabilities.hasTransport(TRANSPORT_WIFI)
            }
        } else {
            try {
                val activeNetworkInfo = connectivityManager.activeNetworkInfo
                Connnectserver = activeNetworkInfo != null && activeNetworkInfo.isConnected
            } catch (e: Exception) {
            }
        }
    }

    override fun onActive() {
        super.onActive()
        context.registerReceiver(
            reciveconnctivitymanager,
            IntentFilter("android.net.conn.CONNECTIVITY_CHANGE")
        )
    }

    override fun onInactive() {
        super.onInactive()
        context.unregisterReceiver(reciveconnctivitymanager)
    }
}

主活动类:AppCompatActivity() { val Connectivity_internet by lazy { Connectivity_check_internet(this) } }

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    Connectivity_internet.observe(this,{
        Log.e("TAG", "onCreate: "+it )
    })

}

}


0
我认为我们应该尽量避免在 ViewModel 和数据层中使用 Context。因此,最好的地方来检查互联网是在我们可以访问到 Context 的地方,例如在 Activity 或 Fragment 中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接