2013-06-04 25 views
0

我試圖從FB獲取記分牌,爲了實現這一點,我向API發出HTTP請求。它必須在一個單獨的線程中完成的,這是我的任務異步類:爲什麼在Android中使用AsyncTask發出HTTP請求時會出現空指針異常?

public class AsyncBuildScoreboard extends AsyncTask<Void, Void,String> { 
ProgressBar pb; 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 

} 

@Override 
protected String doInBackground(Void... voids) { 

    String token = Session.getActiveSession().getAccessToken();  
    try{    
     HttpClient client = new DefaultHttpClient();     
     HttpGet get = new HttpGet("https://graph.facebook.com/"+GameStatic.app_id+"?fields=scores&access_token=" + token); 
     HttpResponse resp = client.execute(get);      
     HttpEntity responseEntity = resp.getEntity(); 
     String response = EntityUtils.toString(responseEntity);  
     return response; 

    } 
    catch (IOException e) 
    { 

    } 
    return ""; 

} 


protected void onPostExecute(String response) { 
    try{  
     JSONObject res = new JSONObject(response);       
     JSONObject scores = res.getJSONObject("scores"); 
     JSONArray data = scores.getJSONArray("data");      
     int len = data.length();       
     String[] values = new String[len]; 
     for(int i=0;i<len;i++) 
     { 
      JSONObject obj = data.getJSONObject(i);       
      JSONObject user = obj.getJSONObject("user"); 
      String name = user.getString("name"); 
      String score = obj.getString("score");   
      values[i] = name + " " + score; 
      GameStatic.scoreboard.add(values[i]); 
     } 
    }  
    catch (JSONException e) 
    { 

    } 



} 

} 

GameStatic是一個外部變量來存儲我從線程獲得。然而,這樣做時:發生

AsyncBuildScoreboard board = new AsyncBuildScoreboard(); 
    board.execute();   
    final ListView listview = (ListView) findViewById(R.id.scorelist);    
    final StableArrayAdapter adapter = new StableArrayAdapter(this, 
       android.R.layout.simple_list_item_1, GameStatic.scoreboard);   
    listview.setAdapter(adapter); 

一個空指針異常,這意味着,GameStatic.scoreboard沒有填充有我想要的條目。

我做錯了什麼,有什麼想法?

我有義務,因爲我真的很準時按下...

public class AsyncBuildScoreboard extends AsyncTask<Void, Void, Void> 
{ 
public ListView list; 
public Context ctx; 
public ArrayList<String> scoreboard = new ArrayList <String>(); 


public AsyncBuildScoreboard(ListView list, Context context) 
{ 
    this.list = list; 
    this.ctx = context; 
} 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 

} 

@Override 
protected Void doInBackground(Void... voids) 
{ 
    Void nothing = null; 
    String token = Session.getActiveSession().getAccessToken();  
    try{    
     HttpClient client = new DefaultHttpClient();     
     HttpGet get = new HttpGet("https://graph.facebook.com/"+GameStatic.app_id+"?fields=scores&access_token=" + token); 
     HttpResponse resp = client.execute(get);      
     HttpEntity responseEntity = resp.getEntity(); 
     String response = EntityUtils.toString(responseEntity); 


    } 
    catch (IOException e) 
    { 

    } 
    return nothing;  
} 


protected void onPostExecute(String response) { 
    try{  
     JSONObject res = new JSONObject(response);       
     JSONObject scores = res.getJSONObject("scores"); 
     JSONArray data = scores.getJSONArray("data");      
     int len = data.length();       
     String[] values = new String[len]; 
     for(int i=0;i<len;i++) 
     { 
      JSONObject obj = data.getJSONObject(i);       
      JSONObject user = obj.getJSONObject("user"); 
      String name = user.getString("name"); 
      String score = obj.getString("score");   
      values[i] = name + " " + score; 
      scoreboard.add(values[i]); 
     } 
    }  
    catch (JSONException e) 
    { 

    } 
    final ArrayAdapter adapter = new ArrayAdapter(ctx, 
      android.R.layout.simple_list_item_1, scoreboard);  
    list.setAdapter(adapter); 


} 



} 
+1

你能複製你的響應字符串嗎? –

+1

返回響應;在阻攔之後。取消返回「」;並嘗試通過@ρяσѕρєяK – Raghunandan

+1

建議的答案您需要notifyDatasetChanged當您修改支持您的列表視圖 – njzk2

回答

1

,你將需要使用onPostExecute用於顯示的分數時doInBackground執行完整的,而不只是後AsyncTask.execute()因爲doInBackground傳遞GameStatic.scoreboard總是在單獨的線程中執行。

可以使用AsyncBuildScoreboard類的構造函數從活動傳遞的ListView實例和語境爲:

ListView listview; 
Context context; 
public AsyncBuildScoreboard(ListView listview,Context context){ 
this.context=context; 
this.listview=listview; 
} 
.... 
protected void onPostExecute(String response) { 
    //...your code here.. 

    StableArrayAdapter adapter = new StableArrayAdapter(context, 
      android.R.layout.simple_list_item_1, GameStatic.scoreboard);   
    listview.setAdapter(adapter); 
} 

,並改變你的活動代碼,作爲傳遞上下文:

ListView listview = (ListView) findViewById(R.id.scorelist); 
AsyncBuildScoreboard board = new AsyncBuildScoreboard (listview, 
                Your_Activity.this); 
board.execute(); 

,或者你也可以創建回調方法使用接口,當UI線程在doInBackground執行完成時觸發。請參閱以下文章以獲取更多詳細信息:

android asynctask sending callbacks to ui

+0

謝謝,這看起來非常合理,雖然我得到一個未定義的構造函數的錯誤,即使我確實在asynctask類中定義它。 .. –

+1

@MichałSzydłowski:好的PLZ顯示您的最新更新的代碼,以獲得更多的幫助 –

+0

你去。現在沒有錯誤,但我的陣列仍然是空的 –

相關問題