android 排队/保存改装请求,并在Internet连接不佳/没有Internet连接时稍后发送

qaxu7uf2  于 2023-05-21  发布在  Android
关注(0)|答案(2)|浏览(198)

我有我的Android应用程序,它不是为离线工作而构建的,所以它依赖于网络连接/数据。
应用程序进行了大量的网络调用,用新的数据集更新API。
我正在对它进行更改,使其脱机工作。
方法我想我将创建一个房间数据库,我将保存改造请求,当有连接时,我将从数据库中提取它们并将其发送到API。
听起来对吗?有没有其他更好的方法,我可以在没有连接时保存请求,当有连接时将这些保存的请求发送到服务器。
我们也可以在房间数据库中保存请求
我不打算做数据库同步与BE(API)和BE(API)处理请求。
你的建议很有价值
谢谢R

f0ofjuux

f0ofjuux1#

我想立刻说--我认为你所要求的不是一个好主意,我不能建议你这样做。但这是你的选择。我想到了在房间里保存请求(也许有点奇怪,但让它去吧):
1.假设你有N个API端点。它们中的每一个都有一些参数(从0到M)。
1.您可以在Room中创建一个表requests,其中包含(1 + P)列,其中P -端点参数的最大数量(可能应该有时间顺序的日期以及是否已处理请求的标记)。所有列都是String类型。第一列-用于端点名称(键)。您将使用该键来定义一个Retrofit端点。
1.在离线模式下,您可以将请求保存在表requests'中的行-端点名称,并将每个参数序列化为JSON字符串。
1.当网络打开时-你查询你的表,反序列化你的API参数,并在一些循环中重新创建你的rest Api请求,在一些巨大的when-statement中,就像这样:
// restApi - your Retrofit interface // apiName - endpoint String key from db // parameter1 - endpoint's parameter1, restored from db saved JSON string // .... // parameterM - endpoint's parameterM, restored from db saved JSON string when (apiName) { "endpoint1" -> restApi.someYourEndPoint1(parameter1) "endpoint2" -> restApi.someYourEndPoint2(parameter1,parameter2) .......... }

8zzbczxx

8zzbczxx2#

按照以下步骤创建MVVM和改造中的房间的此请求:首先:创建一个保存离线数据的表,使用Dao接口,可以创建如下的insert和Query函数(使用suspend的原因是它表明该方法可以在协程scop中用于处理异步操作):

interface DaoOffInfo {

    @Insert
    suspend fun insertOffInfo(newsOffInfo: NewsOffInfo)

    @Query("SELECT*FROM newsoffinfo")
    fun getAllNews():LiveData<List<NewsOffInfo>>
}

ViewModel中的第二步创建一个insert方法来保存来自改装的数据:

fun getAllNews(category:String){
          CoroutineScope(Dispatchers.IO).launch {
              var response =repositoryNews.getAllNews(category)

              withContext(Dispatchers.Main){


                  if(response.isSuccessful){

                      newslist.postValue(response.body()!!)
                          response.body()!!.articles
                    

                     for (i in response.body()!!.articles.indices){
                         name= response.body()!!.articles.get(i).title
                         desc = response.body()!!.articles.get(i).description
                          date = response.body()!!.articles.get(i).publishedAt
                         content = response.body()!!.articles.get(i).content

                         if(desc.isNullOrEmpty()){
                             desc = "There is no Description for this article."
                         }
                         if(content.isNullOrEmpty()){
                             content = "There is no Content for this article."
                         }


                      }

                       insertData(NewsOffInfo(0,name, desc.toString(),date,content.toString()))
                  }

                      }
                  }

          }

和瓦尔allNews =repositoryOffLine.allNewsInfo,实际上从数据库中读取数据,然后在Activity或片段中使用connectivityManager和此方法处理Internet连接:

private fun isNetworkAvailable(): Boolean { 
connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

            val networkInfo = connectivityManager.activeNetworkInfo
            return networkInfo != null && networkInfo.isConnected
        }

最后检查互联网是否连接:

private fun updateRecyclerViews(){

        if(isNetworkAvailable()) {

          //if internet is connected 
}
else {
      //no internet connection ,read the data from room and display which means that with allnews that created to read from database ,we can observe the values.

 

    viewModelRetrofit.allNews.observe()...

}
}

相关问题