Java 变量在asynctask android外部返回null
我有一个asynctask,它通过php获取数据。asynctask工作正常,它将值传递给全局arraylist。但是,当我尝试在onCreate after.execute()上调用变量时,它返回一个空大小/值。我想知道为什么这个全局变量应该有一个值,却返回null。提前谢谢 这是asyntask的代码:Java 变量在asynctask android外部返回null,java,android,android-asynctask,Java,Android,Android Asynctask,我有一个asynctask,它通过php获取数据。asynctask工作正常,它将值传递给全局arraylist。但是,当我尝试在onCreate after.execute()上调用变量时,它返回一个空大小/值。我想知道为什么这个全局变量应该有一个值,却返回null。提前谢谢 这是asyntask的代码: private class get_pendingreq extends AsyncTask<String, Integer, String> { @Overri
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 static ArrayList<String> pendingdate = new ArrayList<String>;
publicstaticarraylistpendingdate=newarraylist;
因为异步任务
未完成。将系统输出打印(“完成”)在onpostExecute()
中执行code>,然后查看谁先打印。异步任务背后的思想是它从主线程异步运行,因此在后台线程上运行。这样它就不会阻止主线程上任何代码的执行
知道这一点后,以下行将紧接着执行:
new get_pendingreq().execute();
System.out.print("alalala" + globalVariables.pendingdate.size());
您的get_pendingreq
类在经过一个小延迟之后才会执行任何实际工作,这意味着在调用上述代码段中的第一行之后,实际上什么都没有发生。您只指示平台在不久的将来启动异步任务
现在,在异步任务完成其工作之前,您在第二行访问的globalVariables.pendingdate
字段将不会有任何值。在执行onPostExecute()
之前不会发生这种情况。换句话说:您试图在错误的时间打印值
只需将该打印移到异步任务的onpostExecute()
方法的末尾(但显然是在返回
之前-这到底是为什么?)
我强烈建议您通读这篇文章。从名称上看,AsyncTask确实是异步运行的。。。
让我解释一下将代码考虑在内的原因:
new get_pendingreq().execute();
这一行将创建一个新的线程来执行,它将运行
异步,因此下一行(即System.out.print(“alalala”)+
globalVariables.pendingdate.size();)在这一行之后立即执行,而无需等待异步任务完全执行。因此,请将这一system.print行放入其中
后执行方法
您确定globalVariables.pendingdate.add(e.getString(“date”))
realy是否有字段“data”?yes,它有值,因为当我在asynctask中调用变量时,它会显示值和大小返回值不应该存在。。我想我忽略了它。是的,我会读一读这篇文章。谢谢。是的,它将返回null,因为代码不会等待AsyncTask
直到完成。只需执行它,然后转到下一个代码行。
new get_pendingreq().execute();