无法更改方法 handler.post 变量



这是我在StackOverflow上的第一篇文章,所以请不要因为我的格式不好而杀了我。

我正在尝试制作一个工作追踪应用程序,当你按下应用程序中的按钮时,它会将你的到达时间和离开时间记录在MySQL数据库中。

我希望应用程序在你启动应用程序时打开正确的(正在工作/不工作(屏幕,我设法让它使用共享的首选项,但我认为如果它能从数据库中请求状态,它会更可靠。

保存日志的表格如下所示:

user_id|到达时间|离开时间

如果用户仍在工作,则会有一行中他有time_of_farrival,但time_of_leave字段为NULL。

这就是我想在这里请求的:

private fun checkWorking(
sharedPreferences: SharedPreferences,
localContext: Context
) : Boolean {
val userId = sharedPreferences.getString("userId", "").toString()
var isWorking = false
if (userId != "") {
val handler = Handler(Looper.getMainLooper())
handler.post {
val field = arrayOfNulls<String>(1)
field[0] = "user_id"
val data = arrayOfNulls<String>(1)
data[0] = userId
val putData = PutData(
Database().host + Database().databaseName + "checkWorking.php",
"POST",
field,
data
)
if (putData.startPut()) {
if (putData.onComplete()) {
val result = putData.result
if(result == "You are working") {
isWorking = true
}
}
}
}
}
return isWorking
}

这是php部分:

<?php
require "DataBase.php";
$db = new DataBase();
if ($db->dbConnect()) {
if($db->checkWorking("logs", $_POST['user_id'])) {
echo "Success";
} else echo "Failure";
}
?>

function checkWorking($table, $userId) {
$userId = $this->prepareData($userId);
$this->sql = "SELECT * FROM " . $table . " WHERE user_id = '" . $userId . "' AND time_of_leave IS NULL";
$result = mysqli_query($this->connect, $this->sql);
if(mysqli_num_rows($result) != 0) {
return true;
}
return false;
}

(PHP部分工作正常,我只是想充分了解我的问题(

我的问题是它总是返回false,因为我在某个地方读到返回的速度比handler.post将isWorking变量更改为true更快。

我该如何解决这个问题,我当然想不出其他可以尝试的方法。

提前感谢!

是的,return语句在处理程序完成之前被调用,因为它将在另一个线程上工作,而return仍在主线程上。

因此,您可以通过使用接口在收到回调时返回回调来解决这个问题,首先您创建如下接口:

public interface CallbackListener<T> {
void onSuccess(T response);
}

然后你必须修改你的方法,将这个接口作为参数

private fun checkWorking(
sharedPreferences: SharedPreferences, 
localContext: Context,
callback: CallbackListener<Boolean>) {
val userId = sharedPreferences.getString("userId", "").toString()
var isWorking = false
if (userId != "") {
CoroutineScope(IO).launch { //running code on background thread
val field = arrayOfNulls<String>(1)
field[0] = "user_id"
val data = arrayOfNulls<String>(1)
data[0] = userId
val putData = PutData(
Database().host + Database().databaseName + "checkWorking.php",
"POST",
field,
data
)
if (putData.startPut()) {
if (putData.onComplete()) {
val result = putData.result
withContext(Main) {//returning to main thread
if (result == "You are working") {
callback.onSuccess(true)
} else
callback.onSuccess(false)
}
}
}
}

我在这里使用了kotlinCoroutines而不是handler,但它可以应用于这两种情况。

然后你可以如下调用你的新方法:

checkWorking(
sharedPreferences,
context,
object: CallbackListener<Boolean>{
override fun onSuccess(response: Boolean?) {
//insert your logic here
}
}
)

最新更新