Android - результат того, что AsyncTask не возвращается в основную активность

I ' m пытается использовать расширенный класс AsyncTask для обработки подключения к URL-адресу, синтаксический анализ JSON, отображение неопределенного ProgressDialog во время синтаксического анализа, и возвращение результатов в виде пар ключ-значение в HashMap в основную Activity. Затем результаты HashMap будут прочитаны основным действием и помещены в поля формы. Однако, хотя я заполняю HashMap в своей AsyncTask (о чем свидетельствуют операторы println), вызов метода в основном Activity, который возвращает HashMap, дает пустой результат. Я не могу понять, что я делаю неправильно, или я неправильно понимаю возможности AsyncTask.

Я обсуждаю преобразование моего класса, расширяющего AsyncTask, на Activity. По сути, пользователь не должен иметь возможности делать что-либо еще во время этого поиска / анализа данных и должен ждать, пока ProgressDialog не исчезнет, ​​прежде чем он сможет снова взаимодействовать с приложением (или нажав кнопку возврата). Также, мое приложение должно иметь возможность обрабатывать определенные случаи в моей AsyncTask, когда перехватываются исключения (не удается подключиться к URL-адресу, плохой JSON, не удается найти идентификатор продукта для поиска), и настраиваемые диалоговые окна ошибок адаптированы для этих исключений. Я мог бы легко сделать это, если бы этот класс был Activity, так как я мог бы отправлять обратно разные коды результатов при вызове finish (), в зависимости от того, было ли обнаружено исключение.

Опять же, я не уверен, что AsyncTask - лучшее решение здесь, поскольку пользователь не будет делать ничего другого, пока информация собирается и анализируется. Пожалуйста, сообщите мне, имеет ли смысл новое Activity или я просто искажаю свою реализацию фонового потока.

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;
    }

}
9
задан Keeb13r 2 December 2010 в 07:33
поделиться