为什么在Android中使用AsyncTask发出HTTP请求时会出现空指针异常?

为什么在Android中使用AsyncTask发出HTTP请求时会出现空指针异常?,android,android-asynctask,request,Android,Android Asynctask,Request,我试图从FB获取记分板,为了实现这一点,我向API发出HTTP请求。它必须在单独的线程上完成,下面是我的异步任务类: public class AsyncBuildScoreboard extends AsyncTask<Void, Void,String> { ProgressBar pb; @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected Str

我试图从FB获取记分板,为了实现这一点,我向API发出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.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); 


}



}
公共类AsyncBuildScoreboard扩展了AsyncTask
{
公共列表视图列表;
公共环境ctx;
公共ArrayList记分板=新ArrayList();
公共AsyncBuildScoreboard(列表视图列表、上下文)
{
this.list=列表;
this.ctx=上下文;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的空位背景(空位…空位)
{
无效=无效;
字符串令牌=Session.getActiveSession().getAccessToken();
试试{
HttpClient=new DefaultHttpClient();
HttpGet=新的HttpGet(“https://graph.facebook.com/“+GameStatic.app_id+”?字段=分数和访问_令牌=“+token”);
HttpResponse resp=client.execute(get);
HttpEntity responseEntity=resp.getEntity();
字符串响应=EntityUtils.toString(responseEntity);
}
捕获(IOE异常)
{
}   
一无所获;
}
受保护的void onPostExecute(字符串响应){
试试{
JSONObject res=新的JSONObject(响应);
JSONObject分数=res.getJSONObject(“分数”);
JSONArray data=scores.getJSONArray(“数据”);
int len=data.length();
字符串[]值=新字符串[len];

对于(int i=0;i您需要使用
onPostExecute
doInBackground
执行完成时显示分数,而不是在
AsyncTask.execute()之后通过
GameStatic.scoreboard
,因为
doInBackground
总是在单独的线程中执行,所以它会被忽略

您可以使用
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线程上触发。有关更多详细信息,请参阅以下文章:


您能复制您的响应字符串吗?返回响应;在捕获块之后。删除返回“”;并尝试@ρ∑ρѕρєKyou建议的答案当您修改支持ListView的数组时需要通知DataSetChanged谢谢,这看起来非常合理,尽管我得到了一个未定义构造函数的错误,尽管我确实在asynctask类中定义了它…@MichałSzydłowski:好的,请显示您最新更新的代码以获得更多帮助你去吧。现在没有错误,但我的数组仍然是空的……我会试试,但是为什么你要把ArrayAdapter实例放在for循环中?@MichałSzydłowski:bez如果json解析中出现任何错误,那么ArrayAdapter代码就不会执行,你可以根据需要更改它
ListView listview = (ListView) findViewById(R.id.scorelist);
AsyncBuildScoreboard board = new AsyncBuildScoreboard (listview,
                                                     Your_Activity.this);
board.execute();