Я пытаюсь создать небольшое приложение, которое извлекает JSON с сервера, который зависит от ввода пользователя.Подождите, пока класс с задачей async не будет выполнен
До сих пор я следующие работы:
- Пользователь вводит поисковый термин
- App находит результаты поиска
Проблема, которую я только сейчас анализировать данные в моем главном классе как только результаты будут получены.
My Code: Ниже приведен важный код. Я не включил метод, который анализирует или извлекает данные, поскольку они работают.
В принципе, мне нужен способ отправить сигнал «done» или что-то в метод, который вызывает мой метод ResultsGetter.getToday(), как только данные будут получены, как при попытке доступа к данным как есть, это все null, поскольку данные еще не закончены.
Основная деятельность
public class MainActivity extends Activity implements android.view.View.OnClickListener{
ResultsGetter results;
HttpClient client;
EditText location;
Button search;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
client = new DefaultHttpClient();
location = (EditText) findViewById(R.id.etLocation);
search = (Button) findViewById(R.id.btSearch);
search.setOnClickListener(this);
search= new ResultsGetter(
this,
0,
"MY DATA URL",
client);
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
results.getToday(location.getText().toString());
}
}
Мой ResultsGetter класс
public class ResultsGetter {
public ResultsGetter(Context c, int f, String url, HttpClient client) {
this.context = c;
this.term = f;
this.url = url;
this.client = client;
}
public void getToday(String location) {
getData = new Reader();
builtUrl = url + "?length=today&city=" + location;
getData.execute();
}
public class Reader extends AsyncTask<String, Integer, JSONObject> {
@Override
protected JSONObject doInBackground(String... params) {
// TODO Auto-generated method stub
try {
alldata = getData();
return alldata;
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
Log.e("Error", "CLIENT Exception " + e.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
Log.e("Error", "IOException " + e.toString());
} catch (JSONException e) {
// TODO Auto-generated catch block
Log.e("Error", "JSON Exception " + e.toString());
}
return null;
}
@Override
protected void onPostExecute(JSONObject result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
Log.e("Success", "JSON retrieved");
parseData();
}
}
}
Но как я могу проверить это из своего основного вида деятельности? где я вызываю results.getToday() и т. д. Я хочу подождать, пока это полностью не закончено, прежде чем двигаться дальше, поскольку по этой точке данные будут извлечены, а строковые переменные в ResultGetter будут иметь значение данных JSON. – nmyster
Ну, если вы хотите что-то сделать, когда «AsyncTask» будет завершено, вам нужно будет запустить его из 'onPostExecute'. Вы можете создать интерфейс для задачи, которую вы передадите ему при создании, которую вы определяете в «Деятельности», а затем вы вызываете конкретный метод в интерфейсе из 'onPostExecute'. –
Вот пример того, что я описывал выше: http://stackoverflow.com/a/9963705/220710 –