0

私は 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 は、スレッドから取得したものを格納するための外部変数です。それでも、これを行うとき:

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


}



}
4

1 に答える 1

1

常に別のスレッドで実行されるため、直後に渡すのではなく、実行完了onPostExecute時にスコアを表示するために使用する必要があります。doInBackgroundGameStatic.scoreboardAsyncTask.execute()doInBackground

AsyncBuildScoreboardListView インスタンスと Context を Activity から次のように渡すために、クラス コンストラクターを使用できます 。

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); 
}

Context を渡すように Activity コードを変更します。

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

または、doInBackground の実行が完了したときに UI スレッドで起動するインターフェイスを使用して、コールバック メソッドを作成することもできます。詳細については、次の投稿を参照してください。

UIにコールバックを送信するandroid asynctask

于 2013-06-04T20:21:30.747 に答える