사용자 입력에 의존하는 서버에서 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();
}
}
}
하지만 내 주요 활동에서이를 어떻게 확인합니까? 여기서 results.getToday() 등을 호출합니다 ... 그 시점까지 계속 끝나기 전에 데이터가 검색되고 ResultGetter 내의 문자열 변수는 JSON 데이터의 값을 가질 때까지 기다리고 싶습니다. – nmyster
AsyncTask가 끝났을 때 뭔가를하고 싶다면'onPostExecute'에서 실행해야합니다. 'Activity'에서 정의 할 생성시에 전달할 태스크를위한 인터페이스를 만들 수 있고, 인터페이스의 특정 메소드를'onPostExecute'에서 호출 할 수 있습니다. –
다음은 위에서 설명한 내용의 예입니다. http://stackoverflow.com/a/9963705/220710 –