0

ユーザーがボタンをクリックした後に GeoPoint の配列を返すアクティビティを作成しました。AsyncTask には、http リクエストを実行し、応答を解析するコードが抽出されます。メソッドによって返された値onPostExecute()を割り当てたメソッドでは、機能しませんでしたoverlayListdoInBackground()

overlayList.size()  

NullPointerException が発生します。これが私の元のコードです:

public class MyActivity extends Activity {

Button bt;
TextView tv1;
List<GeoPoint> overlayList;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    bt = (Button) findViewById(R.id.button);
    tv1 = (TextView) findViewById(R.id.textView);

    bt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            String query = "http://maps.googleapis.com/maps/api/directions/json?origin=bla-bla&destination=bla-bla&sensor=false";

            Request mat =  new Request();
            mat.execute(query);

            if (overlayList.size() > 0){
                tv1.setText("List is OK!");
            }

        }
    });
}

private class Request extends AsyncTask<String, Void, ArrayList<GeoPoint>> {

    @Override
    protected ArrayList<GeoPoint> doInBackground(String... params) {
        return parse(connect(params[0]));
    }

    @Override
    protected void onPostExecute(ArrayList<GeoPoint> geoPoints) {
        super.onPostExecute(geoPoints);
        overlayList = geoPoints;
    }

    public JSONObject connect(String url) {
        ...    
    }

    public ArrayList<GeoPoint> parse(JSONObject jsonObject) {
        ...
    }

}

しかし、私OnClickListenerがそのように変更する場合:

HttpRequest mat =  new HttpRequest();
mat.execute(query);

try {
    overlayList = mat.get();
} catch (InterruptedException e) {
    e.printStackTrace();
} catch (ExecutionException e) {
    e.printStackTrace();
}

すべてうまくいきoverlayList.size()、リストのサイズを返します。それで、私の質問 -onPostExecute()メソッドが私のリストを初期化しないのはなぜですか?

4

1 に答える 1