Я пытаюсь использовать расширенный класс AsyncTask для обработки соединения с URL, синтаксического анализа JSON, отображения неопределенного ProgressDialog во время синтаксического анализа и возврата результатов в виде пар ключ-значение в HashMap в основное действие.Затем результаты HashMap будут прочитаны основным действием и помещены в поля формы.Однако, несмотря на то, что я заполняю HashMap в моей AsyncTask (о чем свидетельствуют операторы println), вызов метода в основной Activity, который возвращает HashMap, дает пустой результат.Я не могу понять, если это что-то, что я делаю неправильно, или если я неправильно понимаю возможности AsyncTask.
Я обсуждаю преобразование моего класса, расширяющего AsyncTask, в Activity.По сути, пользователь не должен иметь возможность делать что-либо еще во время этого поиска / анализа данных и должен ждать, пока ProgressDialog не исчезнет, прежде чем он сможет снова взаимодействовать с приложением (или нажав кнопку назад).Кроме того, мое приложение должно иметь возможность обрабатывать определенные случаи в моей AsyncTask, где перехватываются исключения (невозможно подключиться к URL, неверный JSON, не удается найти идентификатор продукта для поиска), и настраиваемые диалоги ошибок настраиваются для этих исключений.Я мог бы легко сделать это, если бы этот класс был Activity, так как я мог бы отправлять разные коды результата при вызове finish (), в зависимости от того, было ли обнаружено исключение.
Опять же, я не уверен, что AsyncTaskлучшее решение здесь, так как пользователь не будет делать ничего другого, пока информация собирается и анализируется.Пожалуйста, посоветуйте мне, если бы новое действие имело смысл или я просто искажаю свою реализацию фонового потока.
MainActivity.java
mInitiateProductLookupButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
ProductLookup pl = new ProductLookup(id, MainActivity.this);
pl.execute();
// The below variable is always empty!
HashMap<String, String> productInfo = pl.getProductInfo();
applyProductInfoToFormFields(productInfo);
}
});
ProductLookup.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;
}
}