java - 为什么在 do-while 中后面的代码在前面的代码之前执行?
问题描述
我想在不知道确切工厂数量的情况下从本地服务器获取工厂数据。以下是一些代码:
public class StartActivity extends AppCompatActivity implements View.OnClickListener{
boolean isSuccess = false;
RequestQueue queue =NoHttp.newRequestQueue();
ArrayList<String> fac_name = new ArrayList<>();
ArrayList<String> lat = new ArrayList<>();
ArrayList<String> lng = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//...
NoHttp.initialize(this);
//...
do {
int id = 1;
getFactories(id);
id++;
Log.d("wellS", String.valueOf(isSuccess));
}while(isSuccess);
}
public void getFactories(final int id){
isSuccess = false;
String url ="http://192.168.0.108:5000/factories/"+id;
Request<JSONObject> request = NoHttp.createJsonObjectRequest(url);
queue.add(0, request, new OnResponseListener<JSONObject>() {
@Override
public void onStart(int what) {
Log.d("wellS", "Started to get data from server");
}
@Override
public void onSucceed(int what, Response<JSONObject> response) {
if(response.responseCode() == 200){
Log.d("wellS", "Successfully connected to server");
JSONObject j1 = response.get();
Iterator<String> it = j1.keys();
String key = it.next();
String value = null;
try {
value = j1.getString(key);
JSONObject j2 = new JSONObject(value);
Iterator<String> it2 = j2.keys();
int count = 1;
while(it2.hasNext()) {
String key2 = it2.next();
String value2 = j2.getString(key2);
switch (count) {
case 1:
fac_name.add(value2);
break;
case 3:
lat.add(value2);
break;
case 4:
lng.add(value2);
break;
default:
break;
}
count++;
}
Log.d("wellS", "工厂名称:" + fac_name.get(id-1)+" 纬度:"+lat.get(id-1)+" 经度:"+lng.get(id-1));
isSuccess = true;
Log.d("wellS", String.valueOf(isSuccess)+ " ABC");
} catch (JSONException e) {
e.printStackTrace();
}
}
}
@Override
public void onFailed(int what, Response<JSONObject> response) {
Exception exception = response.getException();
if(exception instanceof NetworkError) {
Log.d("wellS", "Error");
}
}
@Override
public void onFinish(int what) {
Log.d("wellS", "Connection finished");
}
});
}
在方法onSucceed
中getFactories
,有一行Log.d("wellS", String.valueOf(isSuccess)+ " ABC");
,在中执行该方法后do-while
,有Log.d("wellS", String.valueOf(isSuccess))
。但是logcat显示:
2019-05-12 19:42:17.597 18535-18535/? D/井:错误
2019-05-12 19:42:17.646 18535-18535/? D/wellS:开始从服务器获取数据
2019-05-12 19:42:17.845 18535-18535/? D/wellS:连接服务器成功
2019-05-12 19:42:17.846 18535-18535/? D/wellS:工厂名称:南京纬度:32.013521 经度:118.776431
2019-05-12 19:42:17.846 18535-18535/? D/wellS:真正的 ABC
2019-05-12 19:42:17.846 18535-18535/? D/wellS:连接完成
似乎第二行在第一行之前执行,并且do-while
只执行了一次。这是为什么?
解决方案
好吧,因为队列将在新创建的线程中异步处理请求。这意味着它不会阻止主线程(包含2019-05-12 19:42:17.597 18535-18535/? D/wellS: false
)的运行。
服务器请求是阻塞操作,事实上它阻塞了它正在运行的线程,直到收到响应。在分开的线程中执行操作有助于不阻塞父线程。
推荐阅读
- dictionary - 法语语音词典
- javascript - 即使在控制台日志上定义了反应状态也是未定义的
- javascript - React:在动画期间调用 Render()。怎么了?
- r - 如何用一个向量制作一个由两个矩阵组成的数组?
- typescript - 使用参数对函数进行类型推断
- elasticsearch - 如何从输出中的elasticsearch中只获取一个字段?
- javascript - Javascript:当用户从树中选择/取消选择节点时如何保留树结构和祖父母关系
- handlebars.js - 如何在 bigcommerce 车把中显示 JS 变量?
- c++ - 这段代码如何不能解决 ABA 问题?
- java - 我应该使用什么来代替弃用的 CollectionModel?