2013-09-30 6 views
0

Я пытаюсь создать небольшое приложение, которое извлекает 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(); 

     } 

    } 

} 

ответ

0

магазин экземпляр AsyncTask затем вызвать cancel на него, когда вы хотите, чтобы остановить выполнение, то вы можете проверить isCancelled() в doInBackground, чтобы закончить рано. И onPostExecute не будет работать, если задача будет отменена до завершения.

+0

Но как я могу проверить это из своего основного вида деятельности? где я вызываю results.getToday() и т. д. Я хочу подождать, пока это полностью не закончено, прежде чем двигаться дальше, поскольку по этой точке данные будут извлечены, а строковые переменные в ResultGetter будут иметь значение данных JSON. – nmyster

+0

Ну, если вы хотите что-то сделать, когда «AsyncTask» будет завершено, вам нужно будет запустить его из 'onPostExecute'. Вы можете создать интерфейс для задачи, которую вы передадите ему при создании, которую вы определяете в «Деятельности», а затем вы вызываете конкретный метод в интерфейсе из 'onPostExecute'. –

+0

Вот пример того, что я описывал выше: http://stackoverflow.com/a/9963705/220710 –

Смежные вопросы