2013-09-30 3 views
0

사용자 입력에 의존하는 서버에서 JSON을 가져 오는 작은 앱을 만들려고합니다.비동기 작업이 완료 될 때까지 기다리십시오.

은 지금까지 나는 일을 다음 있습니다 :

  • 사용자가 검색어를 입력
  • 앱은 검색

난 그냥 지금 내 메인 클래스의 데이터를 구문 분석 한 문제 결과 발견 결과가 검색되면

내 코드 : 아래는 중요한 코드입니다. 필자는 이들이 작동 할 때 데이터를 구문 분석하거나 검색하는 방법을 포함하지 않았습니다.

기본적으로 데이터에 액세스하려고 할 때 데이터 검색이 완료되면 내 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 인스턴스가 다음 다음에 isCancelled()을 확인할 수 있습니다 그것에 cancel 전화 doInBackground이 일찍 종료됩니다. 완료 전에 작업을 취소하면 onPostExecute이 실행되지 않습니다.

+0

하지만 내 주요 활동에서이를 어떻게 확인합니까? 여기서 results.getToday() 등을 호출합니다 ... 그 시점까지 계속 끝나기 전에 데이터가 검색되고 ResultGetter 내의 문자열 변수는 JSON 데이터의 값을 가질 때까지 기다리고 싶습니다. – nmyster

+0

AsyncTask가 끝났을 때 뭔가를하고 싶다면'onPostExecute'에서 실행해야합니다. 'Activity'에서 정의 할 생성시에 전달할 태스크를위한 인터페이스를 만들 수 있고, 인터페이스의 특정 메소드를'onPostExecute'에서 호출 할 수 있습니다. –

+0

다음은 위에서 설명한 내용의 예입니다. http://stackoverflow.com/a/9963705/220710 –

관련 문제