我想在获取我在本地数据库中存储值的值后,使用AsyncHttpClient在for循环中调用php文件。
我正在向我的php文件发送参数,因为它需要从mySQL获取数据。提取部分工作正常,但在存储数据时,我遇到了问题。我实际上存储了通过php接收的值,然后将参数值添加到相同的db表中。
问题在于,当我尝试获取数据时,循环发送正确的参数值,但是当接收到JSONARRAY数据并将其存储到DB参数值时,始终是for循环中的最后一个数字。这是代码和示例:
private void getSubMenuValues()
{
for (int i = 0; i < localdb.getCountValue(); i++)
{
String Id2 = localdb.getValue().get(i).getID();
Log.e("DB","Value"+Id2); (All the id2 value is printed immeidately in Log.)
parent_ID = Id2;
Log.e("Outside Async","Value"+parent_ID);
final RequestParams requestParams = new RequestParams();
requestParams.put("SId", Id2);
final String uploadWebsite = url_grant_id_details;
AsyncHttpClient client = new AsyncHttpClient();
client.post(uploadWebsite, requestParams, new JsonHttpResponseHandler()
{
private JSONArray details;
private int success;
private String ImageURL;
private String IsChild;
private String SId;
private String SName;
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response)
{
try
{
alldetails = response.getJSONArray("alldetail");
for (int i = 0; i < details.length(); i++)
{
JSONObject c = alldetails.getJSONObject(i);
SId = c.getString("SId");
SName = c.getString("SName");
IsChild = c.getString("IsChild");
ImageURL = c.getString("ImageURL");
Log.e("Inside HTTP REQUEST","Value"+parent_ID); (Value is always the last number in the loop)
localdb.setProfileDetails(SId, SName, IsChild, ImageURL, parent_ID);
}
}
catch (JSONException e)
{
e.printStackTrace();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse)
{
super.onFailure(statusCode, headers, throwable, errorResponse);
Toast.makeText(Main.this, "Unable to connect to server. Check your network !!", Toast.LENGTH_SHORT).show();
}
});
}
}
这里,parent_id = id2之前的第一个日志会立即打印所有值,而不是逐个打印。
这样的事情:
03-15 12:36:27.060: E/DB(16205): Value 4
03-15 12:36:27.099: E/DB(16205): Value 3
03-15 12:36:27.130: D/dalvikvm(16205): GC_FOR_ALLOC freed 244K, 3% free 10191K/10472K, paused 16ms, total 16ms
03-15 12:36:27.146: E/DB(16205): Value 5
03-15 12:36:27.154: E/DB(16205): Value 63
03-15 12:36:27.169: E/DB(16205): Value 62
03-15 12:36:27.185: I/Choreographer(16205): Skipped 40 frames! The application may be doing too much work on its main thread.
03-15 12:36:27.701: V/AsyncHttpResponseHandler(16205): Progress 1376 from 628 (219%)
03-15 12:36:27.701: V/AsyncHttpResponseHandler(16205): Progress 1669 from 628 (266%)
03-15 12:36:27.716: E/Inside HTTP Request(16205): Value62
03-15 12:36:27.755: E/Inside HTTP Request(16205): Value62
03-15 12:36:27.787: E/Inside HTTP Request16205): Value62
如果检查日志:DB值立即打印4,3,5,63,62然后在http请求之后它在循环中始终为62。
我不确定究竟发生了什么?
有人可以帮我解释为什么会发生这种情况以及如何在循环中调用Async http请求吗?
谢谢!
答案 0 :(得分:1)
如果您希望parent_ID值与每个事务的数量不同,则应定义一个本地变量,而不是当前变量的全局变量。
更改
parent_ID = Id2;
到
final int parent_ID = Id2;
答案 1 :(得分:0)
我不认为应该循环调用异步任务。
您可能需要考虑使用IntentService,请参阅此帖子: AsyncTask inside a loop
更简单的选择是更改代码,以便每个AsyncHttpClient实例在继续下一个实例之前完成。