android - 如何使用 volley 在 Kotlin 中同步 mysql 和 sqlite 数据库
问题描述
我正在尝试构建一个应用程序(Kotlin)来存储可以离线和在线工作的公交车票数据。
流程:-
a) 输入数据 -> 使用 volley 通过 JSON HTTP 请求将其发送到远程 MySQL db
b) 如果 mysql 输入成功,则将 upload_status 设置为 1(数据已上传) -> 将数据存储到 sqlite status = 1
c)如果它不发送到mysql(由于互联网连接问题)将upload_status设置为0(数据不上传到远程mysql)->将数据存储到status = 0的sqlite
之后我想运行一个协程或某种作业调度程序将行从状态为 0 的 sqlite 推送到具有特定时间框架的 mysql。
目前,如果网络连接正常,我可以将数据发送到 mysql 和 sqlite。但是如果连接不工作,那么 volley(Async task) 开始尝试将数据发送到 mysql,同时执行 sqlite 语句,然后从 volley 获得任何响应。由于凌空响应较晚,无法将状态值设置为正确的值(即 0)并插入到 sqlite
下面是我来自 MainActivity.kt 的代码
Response.Listener<String> { response ->
try{
Log.i("tagconvertstr", "["+response+"]");
val obj = JSONObject(response)
u_status = 1;
Log.i("Uploaded", "done1"+u_status.toString());
Toast.makeText(applicationContext,obj.getString("message"),Toast.LENGTH_LONG).show()
}catch (e: JSONException){
e.printStackTrace()
}
},
object : Response.ErrorListener{
override fun onErrorResponse(volleyError: VolleyError){
u_status = 0;
Log.i("ERROR TAG", "err1"+u_status.toString());
Toast.makeText(applicationContext, volleyError.message, Toast.LENGTH_LONG).show()
}
}){
@Throws(AuthFailureError::class)
override fun getParams(): Map<String, String>{
val params = HashMap<String, String>()
params.put("origin", origin)
params.put("destination", destination)
params.put("AdultQt", AdultQt)
params.put("ChildQt", ChildQt)
return params
}
}
VolleySingleton.instance?.addToRequestQueue(stringRequest)
Log.i("TAG", "final1"+u_status.toString());
val databaseHandler: DatabaseHandler= DatabaseHandler(this)
if(origin.trim()!="" && destination.trim()!=""){
val status = databaseHandler.addTicket(TicketModelClass(origin, destination, Integer.parseInt(AdultQt),Integer.parseInt(ChildQt),(u_status)))
if(status > -1){
Toast.makeText(applicationContext,"record save",Toast.LENGTH_LONG).show()
editTextOrigin.text.clear()
editTextDestination.text.clear()
}
}else{
Toast.makeText(applicationContext,"origin and destination cannot be blank", Toast.LENGTH_LONG).show()
}
VolleySingleton.kt
import android.app.Application
import android.nfc.Tag
import com.android.volley.Request
import com.android.volley.RequestQueue
import com.android.volley.toolbox.Volley
class VolleySingleton : Application(){
override fun onCreate() {
super.onCreate()
instance = this
}
val requestQueue: RequestQueue? = null
get(){
if(field == null){
return Volley.newRequestQueue(applicationContext)
}
return field
}
fun <T> addToRequestQueue(request: Request<T>){
request.tag = TAG
requestQueue?.add(request)
}
companion object{
private val TAG = VolleySingleton::class.java.simpleName
@get:Synchronized var instance: VolleySingleton? = null
private set
}
}
有没有可能让主线程休眠,直到凌空请求被执行,这样我就可以得到它是否上传到 Mysql 的状态。或者我应该将 Mysql 和 sqlite 插入都放在 volley(异步任务)中,这样它们就可以一个接一个地执行?有没有更好的方法来做上面提到的?由于 kotlin 没有太多示例,因此一些示例会很棒。谢谢!
解决方案
推荐阅读
- java - 重新打开应用后顶部栏变暗
- python - Python argparse:增加参数和描述之间的空间
- angular - 禁用对 ngx-datatable 中特定列的选择
- php - 使用不同的表登录 Laravel Passport Api
- php - 我可以更改思维导图吗?
- angular - 如何获取图表上点击的项目(primeNg图表+角度应用程序)
- php - 多个网站的 CakePHP 项目
- angular - Ionic 3/Angular 4/5 http 帖子 - 未找到
- jhipster - JHipster - 纱线构建失败
- postgresql - Amazon Aurora PostgreSQL:克隆能力:缺点?