如何用截击进行循环
How to perform loop with volley
循环有问题。在我看来,这应该可行,但要经过一个循环。我必须检查可用性服务器,我没有其他想法。
服务器给出答案:
{"exist":true}
do {
generateNumber = generate();
getExsistResponse = "http://skidd.herokuapp.com/exist/" + generateNumber;
final StringRequest request = new StringRequest(Request.Method.GET, getExsistResponse, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
existObject exist = new Gson().fromJson(response, existObject.class);
exist.getExist();
String abcd = exist.getExist();
Boolean boolean1 = Boolean.valueOf(abcd);
if (boolean1) {
Log.i("Info", "Pokój: " + abcd);
textView.setText("" + boolean1);
Toast.makeText(getApplicationContext(), response, Toast.LENGTH_SHORT).show();
} else {
textView.setText("" + boolean1);
Toast.makeText(getApplicationContext(), response, Toast.LENGTH_SHORT).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//When an error
}
});
ConnectionManager.getInstance(this).add(request);
//Add the request to the RequestQueue.
}while (boolean1);
这是我的 existObject class:
public class existObject {
@SerializedName("exist")
private String checkexist;
public String getExist() {
return checkexist;
}
public void getExist(String name) {
this.checkexist = name;
}
}
这种方法的逻辑并不合理。您已经假设 do-while
循环在每个 Web 服务调用完成后检查 boolean1
的值。实际上,发生的情况是甚至在第一个 Web 服务调用完成之前,do-while
循环已经进入循环的下一次迭代,并且 boolean1
可能仍然是 false,因为第一个网络服务调用尚未完成。所以 do-while
循环中断。
意识到这一点:网络服务调用是异步。您根本无法预测需要多少时间才能完成,而且每次 Web 服务调用完成所需的时间总是会有所不同。另一方面,您的 do-while
循环是 同步的 :它不断创建 StringRequest
对象并将它们添加到 RequestQueue
,并且这些请求不会立即执行,因此 boolean1
的值可能已正确设置,也可能未正确设置 do-while
循环的下一次迭代。
你需要找到另一种方式来进行连续的网络调用,这样它们就不会以这种方式相互依赖。如果你仍然想这样做并依赖于 boolean1
,试试这个:
- 创建
AsyncTask
并执行 HttpURLConnection
请求(以及
在其 doInBackground()
中不是 Volley Request
) 并设置值
boolean1
那里。
- 如果
boolean1
的值为true
,则创建一个新的实例
onPostExecute()
中的相同 AsyncTask
并调用 execute()
到
开始下一个网络服务调用。
循环有问题。在我看来,这应该可行,但要经过一个循环。我必须检查可用性服务器,我没有其他想法。
服务器给出答案:
{"exist":true}
do {
generateNumber = generate();
getExsistResponse = "http://skidd.herokuapp.com/exist/" + generateNumber;
final StringRequest request = new StringRequest(Request.Method.GET, getExsistResponse, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
existObject exist = new Gson().fromJson(response, existObject.class);
exist.getExist();
String abcd = exist.getExist();
Boolean boolean1 = Boolean.valueOf(abcd);
if (boolean1) {
Log.i("Info", "Pokój: " + abcd);
textView.setText("" + boolean1);
Toast.makeText(getApplicationContext(), response, Toast.LENGTH_SHORT).show();
} else {
textView.setText("" + boolean1);
Toast.makeText(getApplicationContext(), response, Toast.LENGTH_SHORT).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//When an error
}
});
ConnectionManager.getInstance(this).add(request);
//Add the request to the RequestQueue.
}while (boolean1);
这是我的 existObject class:
public class existObject {
@SerializedName("exist")
private String checkexist;
public String getExist() {
return checkexist;
}
public void getExist(String name) {
this.checkexist = name;
}
}
这种方法的逻辑并不合理。您已经假设 do-while
循环在每个 Web 服务调用完成后检查 boolean1
的值。实际上,发生的情况是甚至在第一个 Web 服务调用完成之前,do-while
循环已经进入循环的下一次迭代,并且 boolean1
可能仍然是 false,因为第一个网络服务调用尚未完成。所以 do-while
循环中断。
意识到这一点:网络服务调用是异步。您根本无法预测需要多少时间才能完成,而且每次 Web 服务调用完成所需的时间总是会有所不同。另一方面,您的 do-while
循环是 同步的 :它不断创建 StringRequest
对象并将它们添加到 RequestQueue
,并且这些请求不会立即执行,因此 boolean1
的值可能已正确设置,也可能未正确设置 do-while
循环的下一次迭代。
你需要找到另一种方式来进行连续的网络调用,这样它们就不会以这种方式相互依赖。如果你仍然想这样做并依赖于 boolean1
,试试这个:
- 创建
AsyncTask
并执行HttpURLConnection
请求(以及 在其doInBackground()
中不是 VolleyRequest
) 并设置值boolean1
那里。 - 如果
boolean1
的值为true
,则创建一个新的实例onPostExecute()
中的相同AsyncTask
并调用execute()
到 开始下一个网络服务调用。