2

我有一个通过 php 获取数据的异步任务。asynctask 工作正常,它将值传递给全局数组列表。但是,当我尝试在 .execute() 之后调用 onCreate 上的变量时,它返回一个空大小/值。我想知道为什么这个全局变量在它应该有一个值时返回一个空值。提前致谢!

这是异步任务的代码:

 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>;
4

4 回答 4

4

因为 AsyncTask还没完。放进System.out.print("finish");onPostExcute()看看谁先打印。

于 2013-03-17T04:27:38.737 回答
1

an 背后的想法AsyncTask是它从主线程异步运行,因此在后台线程上运行。这样它就不会阻止主线程上任何代码的执行。

知道这一点后,以下几行将依次执行:

new get_pendingreq().execute();
System.out.print("alalala" + globalVariables.pendingdate.size());

您的get_pendingreq班级在经过一小段延迟之前不会做任何实际工作,这意味着在调用上述代码段中的第一行之后,什么都没有发生。您只是指示平台在不久的将来某处启动异步任务。

现在,globalVariables.pendingdate在异步任务完成其工作之前,您在第二行访问的字段将没有任何值。在执行之前不会发生这种情况onPostExecute()。换句话说:您试图在错误的时间打印值。

只需将该 print 移到异步任务onPostExectute()方法的末尾(但显然在之前return- 为什么甚至在那里?)。

我强烈建议您通读AsyncTask类文档Processes and Threads文章。

于 2013-03-17T04:34:40.697 回答
0

从名称中可以清楚地看出 AsyncTask 确实异步运行......让我解释一下考虑到您的代码:

new get_pendingreq().execute();

这一行将创建一个新的执行线程,它将异步运行,因此下一行(ieSystem.out.print("alalala" + globalVariables.pendingdate.size());) 在这一行之后立即执行,无需等待异步要完全执行的任务。所以将此 system.print 行放在 post execute 方法中...

于 2013-03-17T04:35:52.013 回答
0

你确定,globalVariables.pendingdate.add(e.getString("date"));真的有“数据”字段吗?

于 2013-03-17T04:40:38.523 回答