我有一个asynctask通过php获取其数据。 asynctask工作正常,它将值传递给全局arraylist。但是,当我尝试在.execute()之后调用onCreate上的变量时,它返回一个null size / value(s)。我想知道为什么这个全局变量在它应该有一个值时返回null。提前谢谢!
这是asyntask的代码:
private class get_pendingreq extends AsyncTask<String, Integer, String>
{
@Override
protected String doInBackground(String... arg0)
{
InputStream is = null;
String result = "";
try
{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url+"pending_requests.php");
List<NameValuePair> parameter = new ArrayList<NameValuePair>();
parameter.add(new BasicNameValuePair("email", globalVariables.accountemail));
httppost.setEntity(new UrlEncodedFormEntity(parameter));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
} catch (Exception e)
{
Log.e("log_tag", "Error in http connection " + e.toString());
}
try
{
BufferedReader reader = new BufferedReader(
new InputStreamReader(is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
is.close();
result = sb.toString();
} catch (Exception e)
{
Log.e("log_tag", "Error converting result " + e.toString());
}
return result;
}
@Override
protected void onPostExecute(String result)
{
super.onPostExecute(result);
try
{
/* JSON parsing starts here */
JSONObject jArray = new JSONObject(result);
/*globalVariables.pendingdate = new ArrayList<String>();*/
JSONArray request = jArray.getJSONArray("request");
for (int i = 0; i < request.length(); i++)
{
JSONObject e = request.getJSONObject(i);
/* puts values to arraylist<String> */
globalVariables.pendingdate.add(e.getString("date"));
}
Log.d("striiing", globalVariables.pendingdate.toString());
} catch (JSONException e)
{
e.printStackTrace();
}
}
}
主要活动:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.calendar);
new get_pendingreq().execute();
System.out.print("alalala" + globalVariables.pendingdate.size());
}//this returns null
全局变量:
public static ArrayList<String> pendingdate = new ArrayList<String>;
答案 0 :(得分:4)
因为AsyncTask
没有完成。将System.out.print("finish");
放入onPostExcute()
并查看最先打印的人。
答案 1 :(得分:1)
AsyncTask
背后的想法是它从主线程异步运行,因此在后台线程上运行。这样它就不会阻止主线程上任何代码的执行。
知道了,以下几行将一个接一个地执行:
new get_pendingreq().execute();
System.out.print("alalala" + globalVariables.pendingdate.size());
你的get_pendingreq
课程在经过一段小小的延迟之后才会做任何实际的工作,这意味着在调用上面代码片段中的第一行之后,什么都没发生。您只是指示平台在不久的将来某处启动异步任务。
现在,在异步任务完成其工作之前,您在第二行访问的globalVariables.pendingdate
字段将没有任何值。直到onPostExecute()
执行才会发生这种情况。换句话说:您正试图在错误的时刻打印值。
只需将该打印件移至异步任务onPostExectute()
方法的末尾(但显然在return
之前 - 为什么即使在那里呢?)。
我强烈建议您仔细阅读AsyncTask
class documentation和Processes and Threads文章。
答案 2 :(得分:0)
很明显,AsyncTask的名称确实以异步方式运行... 让我解释一下你的代码:
new get_pendingreq().execute();
这一行将创建一个新的执行线程,它将运行 异步,所以下一行(即.ystem.out.print(“alalala”+ globalVariables.pendingdate.size());)在此行之后立即执行而不等待异步任务执行completly.so将此system.print行放入 后执行方法......
答案 3 :(得分:0)
您确定globalVariables.pendingdate.add(e.getString("date"));
真的有字段“数据”吗?