Android 倒计时闩锁使应用程序停止
我正在使用Android 倒计时闩锁使应用程序停止,android,post,countdownlatch,Android,Post,Countdownlatch,我正在使用CountDownLatch,我需要发送两个JSON来按顺序发送 我说了这个 CountDownLatch countDownLatch = new CountDownLatch(1); try { sendAndgetEODID(countDownLatch); countDownLatch.await(); sendAndge
CountDownLatch
,我需要发送两个JSON
来按顺序发送
我说了这个
CountDownLatch countDownLatch = new CountDownLatch(1);
try {
sendAndgetEODID(countDownLatch);
countDownLatch.await();
sendAndgetDispID();
} catch (InterruptedException e) {
e.printStackTrace();
}
而sendandeodid
函数的内部是
private void sendAndgetEODID(final CountDownLatch countDownLatch) {
Log.e("going to EOD", "going to EOD");
JSONObject params = new JSONObject();
try {
params.put("company_id", CompanyID);
params.put("subcompany_id", subCompID);
params.put("control_no", control_no);
params.put("trip_no", trip_no);
params.put("bus_id", bus_id);
params.put("conductor_id", conductor_id);
params.put("driver_id", driver_id);
params.put("driver2_id", null); //temporary
params.put("device_serial", dev_serial);
params.put("datetimestamp", datetimestamp);
String baseUrl = null;
final ConnectivityManager connMgr = (ConnectivityManager)
mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
final android.net.NetworkInfo wifi = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
final android.net.NetworkInfo mobile = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (wifi.isConnected()) {
baseUrl = url1;
} else if (mobile.isConnected()) {
baseUrl = url2;
}
AndroidNetworking.post(baseUrl + "atts_eods")
.addJSONObjectBody(params)
.addHeaders("Content-Type", "application/json")
.addHeaders("Prefer", "return=representation")
.addHeaders("Accept", "application/vnd.pgrst.object+json")
.setPriority(Priority.HIGH)
.build()
.getAsJSONObject(new JSONObjectRequestListener() {
@Override
public void onResponse(JSONObject response) {
Log.e("response EOD", String.valueOf(response));
try {
eod_return_id = String.valueOf(response.get("id"));
String queryEOD = ("update " + DBHelper.TRANS_EOD + " set " +
DBHelper.TRANS_EOD_RETURN_ID + " = '" + eod_return_id +
"', is_send = '1' where control_no = '" + control_no + "'");
sqldb.execSQL(queryEOD);
String updateTransSettingsEODID = ("update " + DBHelper.TRANS_SETTINGS + " set " +
DBHelper.TRANS_EOD_RETURN_ID + " = '" + eod_return_id +
"' where control_no = '" + control_no + "'");
sqldb.execSQL(updateTransSettingsEODID);
String updateEODIDDispatch = ("update " + DBHelper.TRANS_DISPATCH + " set " +
DBHelper.TRANS_DISPATCH_EOD_ID + " = '" + eod_return_id +
"' where control_no = '" + control_no + "' and trip_no = '" + trip_no + "' ");
sqldb.execSQL(updateEODIDDispatch);
EODIDCatcher = eod_return_id;
Log.e("EODIDCatcher UP!", EODIDCatcher);
countDownLatch.countDown();
} catch (JSONException e) {
e.printStackTrace();
countDownLatch.countDown();
}
}
@Override
public void onError(ANError anError) {
Log.e("anError", "sending failed, it will generate a EODID222 \n" + anError.getErrorBody());
EODIDCatcher = generatedEODID;
String queryEOD = ("update " + DBHelper.TRANS_EOD + " set " + DBHelper.TRANS_EOD_RETURN_ID + " = '" + generatedEODID + "',is_send = '2' where control_no = '" + control_no + "' and trip_no = '" + trip_no + "' ");
sqldb.execSQL(queryEOD);
String updateEODIDDispatch = ("update " + DBHelper.TRANS_DISPATCH + " set " + DBHelper.TRANS_DISPATCH_EOD_ID + " = '" + generatedEODID + "' where control_no = '" + control_no + "' and trip_no = '" + trip_no + "' ");
sqldb.execSQL(updateEODIDDispatch);
String updateTransSettingsEODID = ("update " + DBHelper.TRANS_SETTINGS + " set " + DBHelper.TRANS_EOD_RETURN_ID + " = '" + generatedEODID + "' where control_no = '" + control_no + "' and trip_no = '" + trip_no + "' ");
sqldb.execSQL(updateTransSettingsEODID);
Log.e("EODIDCatcher ERROR", EODIDCatcher);
countDownLatch.countDown();
}
});
} catch (Throwable e) {
e.printStackTrace();
}
}
我可以知道错误在哪里吗?这不是我的第二个功能?。谢谢 它被阻止,因为您的
sendAndgetEODID(倒计时闩锁)代码>不会运行到完成<代码>等待
使当前线程等待,直到锁存器倒计时为零。当您收到响应(异步)时,countDownLatch.await()代码>将被触发(因为它是同步的),并导致线程等待
解决方案:
方法1:
如果您打算执行sendAndgetDispID()代码>在sendAndgetEODID(倒计时锁存器)之后代码>调用已执行,然后只需替换countDownLatch.countDown()代码>与sendAndgetDispID()一起使用代码>如下所示:
new JSONObjectRequestListener() {
@Override
public void onResponse(JSONObject response) {
Log.e("response EOD", String.valueOf(response));
try {
...
sendAndgetDispID();
} catch (JSONException e) {
e.printStackTrace();
sendAndgetDispID();
}
}
@Override
public void onError(ANError anError) {
...
sendAndgetDispID();
}
});
方法2:
处理AndroidNetworking。在不同线程中发布
。这可能会导致一些多线程问题,因此您需要小心并有效地使用synchronize block。我最近尝试过,但有一个实例表明sendAndgetDispID()
响应比sendAndgetDispID()快
@mikenriesgorospe在onError
或onResponse
中执行它,使它在sendandeodid
@mikenriesgorospe之后执行没有问题。让我知道它是否工作它部分工作,但我们将测试多次。请投票给其他人看谢谢@很高兴知道。向上投票。享受编码:-)