URL에 연결하고, JSON을 파싱하고, 파싱하는 동안 불확실한 ProgressDialog를 표시하고 결과를 키 - 값으로 반환하기 위해 AsyncTask 확장 클래스를 사용하려고합니다. 쌍을 HashMap에서 주 활동으로 보냅니다. 그런 다음 HashMap의 결과가 주 활동에 의해 읽혀 양식 필드에 입력됩니다. 그러나, AsyncTask (println 문으로 입증 됨)에서 HashMap을 채우더라도 HashMap을 반환하는 주 Activity에서 메서드를 호출하면 빈 결과가 나타납니다. 이것이 내가 잘못하고있는 것인지 아니면 AsyncTask의 기능을 오해하고 있는지 알 수는 없습니다.안드로이드 - AsyncTask의 결과가 메인 액티비티로 리턴되지 않습니다.
AsyncTask를 활동으로 확장하는 클래스를 변환하는 것에 대해 토론하고 있습니다. 본질적으로 사용자는이 데이터 검색/구문 분석 중에 다른 작업을 할 수 없어야하며 ProgressDialog가 사라져야 응용 프로그램과 다시 상호 작용할 수 있습니다 (또는 뒤로 단추를 눌러서). 또한, 내 응용 프로그램은 예외가 잡힌 (URL에 연결할 수 없으며, 잘못된 JSON, 검색 할 제품 ID를 찾을 수없는) AsyncTask의 특정 케이스를 처리 할 수 있어야하며 이러한 예외에 대한 맞춤 오류 대화 상자가 필요합니다. 예외가 잡히는 지에 따라 finish()를 호출 할 때 다른 결과 코드를 보낼 수 있으므로이 클래스가 Activity 인 경우 쉽게이 작업을 수행 할 수 있습니다.
정보가 모아지고 파싱되는 동안 사용자가 다른 작업을 수행하지 않으므로 AsyncTask가 최상의 솔루션인지 여부에 대해 다시 한 번 확실하지 않습니다. 새로운 액티비티가 의미가 있는지 아니면 내가 백그라운드 스레드의 구현을 망가 뜨리고 있는지 알려주세요.
MainActivity.java
public class ProductLookup extends AsyncTask<Object, Void, HashMap<String, String>> {
private String mProductID;
private Context mContext;
HashMap<String, String> mProductInfo;
ProgressDialog mDialog;
public ProductLookup(String id, Context applicationContext) {
mProductID = id;
mContext = applicationContext;
mProductInfo = new HashMap<String, String>();
}
@Override
protected void onPreExecute() {
mDialog = new ProgressDialog(mContext);
mDialog.setMessage("Loading product info. Please wait...");
mDialog.setIndeterminate(true);
mDialog.setCancelable(false);
mDialog.show();
}
@Override
protected void onPostExecute(HashMap<String, String> result){
super.onPostExecute(result);
mDialog.dismiss();
mProductInfo = result;
}
@Override
protected HashMap<String, String> doInBackground(Object... params) {
try {
// Connect to URL, parse JSON, and add key-value pairs to mProductInfo...
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
finally {
try {
// Close input/output reader variables
} catch (IOException e) {
e.printStackTrace();
}
}
return mProductInfo;
}
public HashMap<String, String> getProductInfo(){
return this.mProductInfo;
}
}
, 나는 나를 컴파일 못하게 오류가 발생 : 아이 private 클래스로 MainActivity의 내부 AsyncTask를 작성 – Keeb13r
"유형의 MainActivity의 어떤 둘러싸는 인스턴스 범위에 액세스 할 수 없습니다" . – Pentium10
하위 개인 클래스는 정확히 어떻게 만듭니 까? – Keeb13r