2011-08-15 2 views
2

Я пытаюсь получить данные с веб-сервера и отображать сообщение «ok» или «invalid key». Пока он получает данные, он должен создавать диалог прогресса. Я пробовал много методов, включая включение внутри потока, но внутри потока диалоговые окна предупреждений не будут работать. Я попытался использовать метод async-задачи, но он тоже не работает. Может ли кто-нибудь помочь мне найти решение? БлагодаряПроблема с задачей Async

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

} 

ответ

3

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

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

Вот некоторые SO вопросов, охватывающих ту же тему: How to use AsyncTask to show a ProgressDialog while doing background work in Android?

Updating progress dialog in Activity from AsyncTask

How can I remove an alert dialog after a AsyncTask has done it's work

+1

С предостережением, которое вам нужно вызвать 'publishProgress()' из методов 'doInBackground', который, в свою очередь, вызывает ваш' onProgressUpdate() ' –

+0

, мой метод должен проверить, что ответ , как передать переменные из метода doinBackground методу onPostExecute? thanks – Sean

+0

Независимо от того, что вы возвращаете из doInProgress, будет параметр «результат», который передается onPostExecute. Вы можете указать, что этот тип параметра, указав третий аргумент типа в AsyncTask @CitizenConn Да, вы правы. Благодарю. – pav

0

Из любопытства ... что произойдет, если удалить «Отклонить» называют immediatelty под вашей линии, где вы показываете диалог? Любая вероятность того, что диалог сразу же будет отменен после создания?

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

dialogue.show() 

ли диалог прогресса любой другой? Из документов ...

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

+0

Диалог прогресса показывает, когда под ним находится нить, и мой диалог предупреждения работает, когда нет потока вне Это. Я хочу иметь возможность показывать диалог прогресса, а затем диалог оповещения, если что-то происходит. Мой .show() находится внутри класса async – Sean

Смежные вопросы