2013-02-23 54 views
0

我正在編寫一個android應用程序我使用後臺線程從Web服務中提取JSONArray。然後我需要在主要活動中與該JSONArray進行交互。下面是我現在在做什麼:JSONArray上的NullPointerException在後臺線程中初始化

public class MainActivity extends Activity { 
JSONArray stories; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    new getAll().execute(); 

// try { 
     System.out.println("stories.length()); 
// } catch (JSONException e) { 
     // TODO Auto-generated catch block 
    // e.printStackTrace(); 
    //} 



} 

而後臺線程:

private class getAll extends AsyncTask <Void, Void, JSONArray> { 
    private static final String url = "http://10.0.2.2:8080/CalibServer/webresources/storypkg.story/"; 
    @Override 
    protected JSONArray doInBackground(Void... params) { 

     //set up client and prepare request object to accept a json object 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpGet httpget = new HttpGet(url); 
     httpget.addHeader("accept", "application/json"); 

     HttpResponse response; 

     String resprint = new String(); 

     try { 
      response = httpclient.execute(httpget); 
      // Get the response entity 
      HttpEntity entity = response.getEntity(); 

      if (entity != null) { 
       // get entity contents and convert it to string 
       InputStream instream = entity.getContent(); 
       String result= convertStreamToString(instream); 
       resprint = result; 
       // construct a JSON object with result 
       stories =new JSONArray(result); 
       // Closing the input stream will trigger connection release 
       instream.close(); 
      } 
     } 
     catch (ClientProtocolException e) {System.out.println("CPE"); e.printStackTrace();} 
     catch (IOException e) {System.out.println("IOE"); e.printStackTrace();} 
     catch (JSONException e) { System.out.println("JSONe"); e.printStackTrace();} 

     System.out.println("FUCKYEAHBG: " + resprint); 
     // stories = object; 
     return stories; 
    } 

我的問題是,我得到一個NullPointerException在調用

System.out.println("stories.length()); 

它的作用像一個沒有初始化stories數組,但是在這個調用被創建之前,不應該由後臺線程(在這個行:stories = new JSONArray(result);)處理這些事情嗎?

我有一種感覺,這是因爲線程 - 也許有另一個步驟,我必須採取更新AsyncTask運行後的主要活動?

回答

1

你不能依靠stories時運行平行到UI線程一個單獨線程初始化和更新stories被初始化。

在AsyncTask運行後,可能還有另一個步驟需要更新主要的 活動?

onPostExecute()的AsyncTask。做任何你需要的UI更新。由於getAll已經是私人內部課程,因此您可以完全訪問活動。您已將stories退還給該(unoverriden)方法,所以這應該是一個小改動。

@Override 
protected void onPostExecute (JSONArray stories) 
{ 
    //use the now initialized stories 
} 
2

您正在初始化後臺線程中的變量。這意味着該行

System.out.println(stories.length()); 

與初始化變量的代碼並行執行。這意味着後臺線程在執行這條線時還沒有時間初始化變量。

您的代碼與以下情況類似:您前面有一個空杯子,並要求某人去喝點咖啡,然後填滿杯子。並且在詢問後立即開始飲酒。顯然,杯子裏面沒有咖啡。

重新閱讀有關如何執行異步任務的android文檔。

相關問題