AsyncTask を作成してインターネットからデータを取得し、そのデータを取得してインテントにバンドルし、新しいアクティビティ (リスト表示) に渡す正しい方法を見つけようとしています。したがって、最初のアクティビティには EditText と Button しかありません。OnClick のイベントでは、タスクを呼び出す必要があり、タスクが完了すると、データはインテント内にバンドルされ、次のアクティビティに渡されます。問題は、onPostExecute から結果を取得し、それらをメイン アクティビティのインスタンス変数に設定すると、タスクが完了したときにそのインスタンス変数が null のままになることです。コードのベアボーン バージョンは次のとおりです。
public class SearchActivity extends Activity implements OnClickListener
{
static final String TAG = "SearchActivity";
private EditText searchInput;
private Button searchBtn;
private PlacesList places;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.search_activity);
searchBtn = (Button) findViewById(R.id.button_search);
searchInput = (EditText) findViewById(R.id.search_input);
searchBtn.setOnClickListener(this);
}
public void onClick(View v) {
if(v == searchBtn)
{
String input = searchInput.getText().toString();
if(input != null && input.length() != 0)
{
try {
new TestTask().execute(input);
Bundle bundle = new Bundle();
bundle.putParcelable("places", places);
Intent i = new Intent(this, SearchResultsActivity.class);
i.putExtras(bundle);
startActivity(i);
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
}
private class TestTask extends AsyncTask<String, Void, PlacesList>
{
private ProgressDialog dlg = new ProgressDialog(SearchActivity.this);
@Override
protected void onPreExecute()
{
dlg.setMessage("test");
dlg.show();
}
@Override
protected PlacesList doInBackground(String...args)
{
try
{
return new PlaceLocator().retrieveResults(args[0]);
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return new PlacesList();
}
@Override
protected void onPostExecute(PlacesList results)
{
SearchActivity.this.places = results;
if(dlg.isShowing())
dlg.dismiss();
}
}
}
アプリケーションをデバッグすると、onPostExecute には有効な PlacesList がすべての結果を含んでいることがわかりますが、タスクの実行後にインスタンス変数の場所が null に設定されるのはなぜですか? AsyncTask から誤って「データを返す」つもりですか?