2012-02-07 2 views
0

Я работаю над приложением, которое подключается к веб-странице, чтобы получить контент. Я хочу показать прогрессdialog, но я думаю, что я делаю что-то неправильно.Использование progressdialog и обработчика

Это мой код:

 final ProgressDialog myProgressDialog = ProgressDialog.show(WhoisBeyondActivity.this, "Wait...", "Fetching data...", true); 
     Handler handler=new Handler(); 
     handler.post(new Runnable() 
      { 
       public void run() 
       { 
        try { 
         // code to execute 
         Thread.sleep(2000); 
        } catch (Exception e) { 

        } 
        myProgressDialog.dismiss(); 
       } 
      }); 

Проблема заключается в том, что progressdialog показана лишь одна секунда в конце операции я хочу сделать. Я думаю, что progressdialog выполняется только при выполнении функции увольнения(), потому что он появляется и быстро исчезает. Это похоже на прогресс, который появляется только для того, чтобы исчезнуть ... помогите мне пожалуйста !!! Я прочитал много учебников, и я попробовал много вариантов, таких как THREAD, а не HANDLER, но это не полезно для меня, потому что мне нужно редактировать интерфейс.

+0

попробовать с помощью отдельного THR для обработки и прогресса. – Johnydep

ответ

0

Вы не хотите использовать отдельный поток для каждого. То, что вы действительно хотите, это AsynTask. Это позволит вам создать диалог выполнения и выполнить фоновую обработку прямо в задаче. Просты в написании и проще реализовать. Если вы ссылаетесь на ссылку, то, что вам нужно, действительно очень похоже на ваш вопрос. С небольшой настройкой, он должен работать отлично для вас.

0
public class HelloActivity extends Activity { 
    protected static final String TAG = "HelloActivity"; 
    ProgressDialog myProgressDialog; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     // 
     showDialog(1); 
     final Handler handler=new Handler(){ 
      @Override 
      public void handleMessage(Message msg) { 
       //update UI here depending on what message is received. 
       switch(msg.what){ 
       case 0: 
        myProgressDialog.dismiss(); 
       } 

       super.handleMessage(msg); 
      } 

     }; 
     Thread t = new Thread(){ 

      public void run(){ 

         try { 
          // code to execute 
          Thread.sleep(5000); 
         } catch (Exception e) { 

         } 
         handler.sendEmptyMessage(0);//nothing to send 
        } 

     }; 
     t.start(); 
    } 
    @Override 
    protected Dialog onCreateDialog(int id) { 
     myProgressDialog = ProgressDialog.show(HelloActivity.this, "Wait...", "Fetching data...", true); 
     return myProgressDialog; 
    } 
} 
1

Причина вы получаете Описанное поведение является то, что метод post будет просто выполнить переданный в runnable против нити к которой Handler прилагается. В вашем случае это поток пользовательского интерфейса.

Вы звоните ProgressDialog.show(), что является асинхронным. Это фактически не показывает диалог, как только метод вернется, скорее вы только что запросили, чтобы интерфейс отображал диалог. Затем вы сразу же post поток, который спит в течение 2 секунд, который добавляется в очередь пользовательского интерфейса и блокирует пользовательский интерфейс от выполнения диалога show. Пользовательский интерфейс затем просыпается от вашего сна, показывает диалог, после чего его отклоняют.

Вы должны выполнить любую операцию сети либо в новом Thread, либо в AsyncTask. Посмотрите на эти ссылки для получения более подробной информации: