2013-03-17 74 views
2

我有一個asynctask通過php獲取其數據。 asynctask工作正常,它將值傳遞給全局數組列表。但是,當我嘗試在.execute()之後調用onCreate上的變量時,它將返回空值/值(s)。我想知道爲什麼這個全局變量返回null時,它應該有一個值。提前致謝!變量返回空外asynctask android

這是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>; 

回答

4

因爲AsyncTask沒有完成。將System.out.print("finish");放入onPostExcute()並查看誰先打印。

+0

做到了這一點。但它仍然返回一個nullpointerexception。 – wacko 2013-03-17 05:03:04

+0

是的,它會返回null,因爲代碼不等待'AsyncTask'直到完成。只需執行它然後轉到下一個代碼行。 – AwadKab 2013-03-17 05:11:47

1

AsyncTask背後的想法是,它與主線程異步運行,因此在後臺線程上運行。這樣它就不會阻塞主線程上任何代碼的執行。

知道了,下面的線將右後對方執行:

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

get_pendingreq類不會做任何實際工作,直到一個小的延遲之後,這意味着調用上面的代碼中第一行後,什麼也沒有發生。您只是指示平臺在不久的將來開始異步任務。

現在,您在第二行訪問的globalVariables.pendingdate字段將不會有任何值,直到異步任務完成其工作。直到執行onPostExecute()纔會發生這種情況。換句話說:你試圖在錯誤的時刻打印這些值。

只需將該打印移動到異步任務的onPostExectute()方法的末尾(但顯然在return之前 - 爲什麼即使有這種情況?)。

我強烈建議您閱讀AsyncTask class documentationProcesses and Threads文章。

+0

回報不應該在那裏..我想我忽略了它。是的,會對文章做一些閱讀。謝謝。 – wacko 2013-03-17 04:48:46

0

它的名字確實的AsyncTask異步運行清除表單... 讓我解釋一下把你的代碼考慮:

new get_pendingreq().execute(); 

這條線將創建執行一個新的線程,它會運行 異步,所以下一行(ieSystem.out.print(「alalala」+ globalVariables.pendingdate.size());)在這行後面執行immidiatly而不等待異步任務完成執行。打印內線 後執行方法...

0

你確定,那globalVariables.pendingdate.add(e.getString("date"));真的有字段「數據」嗎?

+0

是的,它有值,因爲當我調用asynctask裏面的變量時,它會顯示值和大小 – wacko 2013-03-17 04:47:20