我必须将一些东西从数据库发送到服务器。所以,我调用db方法,并获得一个有很多位置的游标。我需要为光标的每个位置发送一个httprequest,但只在服务器收到第一个请求时发送第二个请求,并发送正确的答案。我有这段代码:
final Cursor cursor = db.getData();
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
if(cursorContadores.moveToFirst()){
do{
Call<String> peticion = interfaz.saveToServer(cursor.getString(1), cursor.getString(2));
peticion.enqueue(new Callback<String>() {
@Override
public void onResponse(Response<String> response, Retrofit retrofit) {
if(response.message().equals("ok")){
}else{
}
}
@Override
public void onFailure(Throwable t) {
}
});
}while (cursorContadores.moveToNext());
cursorContadores.close();
db.close();
}
}
});
thread.start();
这样,我认为它不会等到do while块中的每次迭代结束,才能开始下一次迭代。
我怎么能实现这个目标?我能读懂什么来学习如何?
谢谢。
答案 0 :(得分:0)
在您的Http响应中,您可以检查响应代码。 例如,如果成功接收的响应为200,则可以执行以下操作:
HTTPResponse response;
if(response.getStatusLine().getStatusCode()==200){
//SEND NEXT
}
这样,您可以在收到上一个请求后发送下一个请求。 我希望我能正确理解这个问题。 谢谢。
答案 1 :(得分:0)
这绝对可以完成AsyncTask...
在doInBackground()
处理网络请求,一旦doInBackground()
完成,就会在响应中触发onPostExecute()
在那里你可以执行任何发送第二次请愿的代码。
如果你需要一些更通用和可重复使用的东西,你可能想要实现一个回调..我将下一步称为客户端,AsyncTask
作为服务器。
创建一个新界面并创建一些方法存根。
public interface MyEventListener {
public void onEventCompleted();
public void onEventFailed();
}
让您的客户端将MyEventListener的实例传递给服务器。执行此操作的典型方法是让客户端实现接口(MyEventListener)并将其自身传递给服务器。
public class MyActivity implement MyEventListener {
public void startEvent() {
new MyAsyncTask(this).execute();
}
@Override
public void onEventCompleted() {
// TODO
}
@Override
public void onEventFailed() {
// TODO
}
}
在服务器的onPostExecute
上,检查回调是否为null并调用相应的方法。
public class MyAsyncTask extends AsyncTask<Void, Void, Void> {
private MyEventListener callback;
public MyAsyncTask(MyEventListener cb) {
callback = cb;
}
[...]
@Override
protected void onPostExecute(Void aVoid) {
if(callback != null) {
callback.onEventCompleted();
}
}
}