Проблема с асинхронной задачей

Я пытаюсь получить данные с веб-сервера и вывести сообщение «ОК» или «Неверный ключ». Пока он получает данные, он должен создать диалоговое окно прогресса. Я пробовал много методов, включая размещение внутри потока, однако внутри потока диалоги предупреждений не будут работать. Я пытался использовать метод асинхронной задачи, но он тоже не работает. Может ли кто-нибудь помочь мне найти решение? Спасибо

verifyCode.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
    //I surround the async task with the progressdialog so that it should show while the method is working in the background
        final ProgressDialog progressDialog = ProgressDialog.show(
                    Activate.this, "", "Loading...");
            new checkActivationCode().execute(activationCode.toString().toUpperCase()
                    );

            progressDialog.dismiss();       
        }
    });

   public class checkActivationCode extends AsyncTask<String, Void, Void> {

    @Override
    protected Void doInBackground(String... activationCode) {
        // TODO Auto-generated method stub
        try {
            DefaultHttpClient httpclient = new DefaultHttpClient();
            HttpPost httpost = new HttpPost(
                    "https://iphone-radar.com/accounts/confirmation");

            JSONObject holder = new JSONObject();

            holder.put("code", activationCode);
            StringEntity se = new StringEntity(holder.toString());
            httpost.setEntity(se);
            httpost.setHeader("Accept", "application/json");
            httpost.setHeader("Content-type", "application/json");

            ResponseHandler responseHandler = new BasicResponseHandler();
            String response = httpclient.execute(httpost, responseHandler);

            if (response != null) {
                org.json.JSONObject obj = new org.json.JSONObject(response);

                if ("00000000-0000-0000-0000-000000000000".equals(obj
                        .getString("id"))) {
                    new AlertDialog.Builder(Activate.this)
                            .setTitle(
                                    getResources().getString(
                                            R.string.InvalidKey))
                            .setMessage(
                                    getResources()
                                            .getString(
                                                    R.string.PleaseEntervalidRegistration))
                            .setNeutralButton("OK", null).show();

                } else {
                    // add permanent variables
                    SharedPreferences prefs = getSharedPreferences(
                            "Settings", 0);
                    SharedPreferences.Editor editor = prefs.edit();

                    editor.putBoolean("ACTIVATED", true);
                    editor.putString("ID", obj.getString("id"));
                    editor.commit();

                    Intent imTracking = new Intent(Activate.this,
                            ImTracking.class);
                    imTracking.putExtra("ActivationSuccessful", true);
                    // transfer more data
                    startActivity(imTracking);
                }
            }
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();

        }
        return null;
    }

}

person Sean    schedule 15.08.2011    source источник


Ответы (2)


Вы не можете показать какой-либо диалог или диалог прогресса из метода doInBackground(), потому что он не запускается в потоке пользовательского интерфейса. Вы захотите обновить пользовательский интерфейс с обновлениями прогресса, используя метод onProgressUpdate(). Если вы хотите показать AlertDialog по завершении, используйте метод onPostExecute(). И onProgressUpdate(), и onPostExecute() выполняются в потоке пользовательского интерфейса, поэтому ваш код AlertDialog будет работать правильно.

Вот страница AsyncTask с примерами кода о том, как правильно ее использовать (в том числе, где предоставлять обновления пользовательского интерфейса): http://developer.android.com/reference/android/os/AsyncTask.html

Вот несколько вопросов SO, охватывающих одну и ту же тему: in-andr">Как использовать AsyncTask для отображения ProgressDialog при выполнении фоновой работы в Android?

Диалоговое окно прогресса обновления в действии из AsyncTask

Как удалить диалоговое окно предупреждения после того, как AsyncTask выполнила свою работу

person pav    schedule 15.08.2011
comment
С оговоркой, что вам нужно вызывать publishProgress() из методов doInBackground, которые, в свою очередь, вызывают ваш onProgressUpdate() - person citizen conn; 16.08.2011
comment
мой метод должен проверить, что такое ответ, как мне передать переменные из метода doinBackground в метод onPostExecute? Благодарность - person Sean; 16.08.2011
comment
Все, что вы вернете из doInProgress, будет результатом параметра, который будет передан в onPostExecute. Вы можете указать тип этого параметра, указав третий аргумент универсального типа в AsyncTask‹Void,Void,Void› @CitizenConn Да, вы правы. Спасибо. - person pav; 16.08.2011

Из любопытства... что произойдет, если вы немедленно уберете вызов "отклонить" под своей строкой, где вы показываете диалог? Есть шанс, что диалог будет закрыт сразу после создания?

Кроме того... с другими диалогами вы должны пройти

dialogue.show()

Отличается ли диалог прогресса? Из документов....

Открытие диалогового окна прогресса может быть таким же простым, как вызов ProgressDialog.show(). Например, диалоговое окно прогресса, показанное справа, может быть легко достигнуто без управления диалоговым окном с помощью обратного вызова onCreateDialog(int), как показано здесь:

person Delete    schedule 15.08.2011
comment
Диалоговое окно прогресса показывает, когда поток находится прямо под ним, и мой диалог предупреждений работает, когда за его пределами нет потока. Я хочу иметь возможность отображать как диалоговое окно прогресса, так и диалоговое окно предупреждения, если что-то произойдет. Мой .show() находится внутри асинхронного класса - person Sean; 16.08.2011