диалоговое окно предупреждения не отображается - PullRequest
1 голос
/ 04 июля 2011

Я показываю мой диалог предупреждений в отдельной теме, и он не работает для меня.первоначально, когда я нажимаю

кнопку регистрации в течение 3000 мс, я показываю диалог прогресса.и после этого я хочу показать окно предупреждения, но оно не работает.Как это решить?

Заранее спасибо ...!

 register.setOnClickListener(new OnClickListener() {
  public void onClick(View v) {


Log.v(TAG, "Trying to Login");


   showDialog(0);
   t = new Thread() {
    public void run() {
     showDialog(0);
     try {
        Thread.sleep(3000);
        removeDialog(0);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    }
   };
   t.start();


  try {

 some data sending to server

 Object responce=(Object)soapEnvelope.getResponse();
   temp=responce.toString();
   if(temp.equals("1")){

 temp = "The result is 1";
         }

      System.out.println("The result is  "+temp);


        new Thread()
          {
             public void run()
             {
                     try
                          {

            sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
           AlertDialog.Builder successfullyLogin = new Builder(Register.this);
            successfullyLogin.setCancelable(false);
            successfullyLogin.setMessage("Successfully Login !").show();
        //Toast.makeText(getBaseContext(), "Toast text", Toast.LENGTH_LONG).show();
               }
          }; 



          } catch (Exception e) {

          e.printStackTrace();
           }

             }

             });


               }

           @Override
            protected Dialog onCreateDialog(int id) {
             switch (id) {
              case 0: {
               dialog = new ProgressDialog(this);
              dialog.setMessage("Please wait while connecting...");
             dialog.setIndeterminate(true);
             dialog.setCancelable(true);

           }


             return dialog;
               }

            return null;
                 }

Ответы [ 4 ]

3 голосов
/ 04 июля 2011

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

Таким образом, вы неТайм-аут 3000 мс, он просто сбрасывает, когда возвращается.Конечно, вы можете рассчитать, сколько времени займет вход в систему, и сохранить диалог до тех пор, пока не наберется 3000 мс, если хотите, но я бы не стал.Кроме того, если вы хотите сделать паузу в Android, используйте SystemClock.sleep(3000); вместо собственного спящего потока java, поскольку вам не нужно пытаться / перехватывать прерывание.

Пример, который заменяет ваш код (обратите внимание на полное отсутствиепотоков, try / catch и т. д., которые обычно засоряют многопоточный код):

    // ... initialising onClickListener of your button to call the async task
    Button button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            new StartLoginAsyncTask(YOURAPP.this).execute((Void []) null);
        }
    });
}

private class StartLoginAsyncTask extends AsyncTask<Void, Void, Integer> {
    private ProgressDialog dialog;
    private final Context context;

    public StartLoginAsyncTask(Context context) {
        this.context = context;
    }

    @Override
    protected void onPreExecute() {
        // UI work allowed here
        dialog = new ProgressDialog(context);
        // setup your dialog here
        dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        dialog.setMessage(context.getString(R.string.please_wait_message));
        dialog.setCancelable(false);
        dialog.show();
    }

    @Override
    protected Integer doInBackground(Void... ignored) {
        Integer returnCode = doLogin();
        return returnCode;
    }

    @Override
    protected void onPostExecute(Integer returnCode) {
        // UI work allowed here
        dialog.dismiss();
        if (returnCode == LOGIN_OK) {
            // ... show other dialogs here that it was OK
        } else {
            // ... bad news dialog here
        }
    }
}

private Integer doLogin() {
    // ... write your login code here. 
    // This is run in background, do not do any UI work here
    return LOGIN_OK;
}

Если вы хотите, чтобы вход в систему прерывал диалог, добавьте пользовательский TimeoutException к doLogin(), перехватите его вdoInBackground(), вернуть соответствующий целочисленный ответ и обработать его в onPostExecute().

1 голос
/ 04 июля 2011

Взгляните на AsyncTask

Из JavaDocs: AsyncTask позволяет правильно и легко использовать поток пользовательского интерфейса.Этот класс позволяет выполнять фоновые операции и публиковать результаты в потоке пользовательского интерфейса без необходимости манипулировать потоками и / или обработчиками.

1 голос
/ 04 июля 2011

Внутри потока вы должны использовать Handler для отображения AlertDialog:

Handler messageHandler = new Handler() {
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
            case 111: 
                     // Build and show AlertDialog here
                     break;
                    }
                }
}

Используйте ниже вместо showdialog (0);

messageHandler.sendEmptyMessage(111);
1 голос
/ 04 июля 2011

Я думаю, что диалог может быть показан только из основного потока пользовательского интерфейса.Таким образом, идея заключается в том, чтобы иметь обработчик в вашем основном потоке и опубликовать на нем сообщение из нового потока, которое запустит диалог.

...