如何解决如何使用Volley在Kotlin中同步mysql和sqlite数据库
我正在尝试构建一个应用程序(科特琳)来存储可离线和在线使用的公交车票数据。
流程:-
a)接受数据输入->使用截击通过JSON HTTP请求将其发送到远程MySQL数据库
b)如果mysql输入成功,则将upload_status设置为1(数据已上传)->将数据存储到状态为= 1的sqlite中
c)如果没有发送到mysql(由于互联网连接问题),请将upload_status设置为0(数据未上传到远程mysql)->将数据存储到状态为0的sqlite中
之后,我想运行协程或某种Jobscheduler,以在特定时间范围内将状态为0的sqlite的行推送到mysql。
如果网络连接正常,当前无法将数据发送到mysql和sqlite。 但是,如果连接不起作用,则在执行sqlite语句时,volley(Async task)开始尝试将数据发送到mysql,然后再从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插入都置于凌空(异步任务)中,以便它们可以一个接一个地执行?有没有更好的方法来执行上述操作?由于kotlin没有太多示例,因此一些示例会很棒。谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。