Индикатор выполнения Android не отображается

#android #progress-bar

#Android #индикатор выполнения

Вопрос:

 private Handler handler = new Handler()
{
    @Override
    public void handleMessage(Message msg)
    {
        removeDialog(0);
        switch (msg.what)
        {
            case SUCCESS:
                Log.i("LoginActivity", "Got inputstream");
                final InputStream is = (InputStream)msg.obj;
                if (is != null)
                {
                    //TODO: examine the input stream, etc...
                }
                break;
            case FAILURE:
                Log.i("LoginActivity", "Login failed");
                //TODO: Failure handling
                break;
            default:
                break;
        }
    }
};

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

public void loginRequest(String name,String password)
{   
    showDialog(0);
    loginThread thread = new loginThread(serverURL, name, password,getMyIMENumber(), handler);
    thread.start();
}
  

……………

 public class loginThread extends Thread {

String name;
String password;
InputStream is;
String Url;
String ime;

private final Handler handler;

   public loginThread(String Url,String name,String password,String ime,final Handler handler) {
       this.name = name;
       this.Url = Url;
       this.password = password;
       this.ime = ime;
       this.handler = handler;         
   }


   public void run() {
          try{
                  HttpClient httpClient = new DefaultHttpClient();
                  String loginURL = Url "member/login";
                  HttpPost httppost = new HttpPost(loginURL);
                  HttpParams httpParameters = new BasicHttpParams();
                  List<NameValuePair> pairs = new ArrayList<NameValuePair>();
                  if(name.contentEquals(""))
                  {
                      pairs.add(new BasicNameValuePair("ime", ime));
                  }
                  else
                  {
                      pairs.add(new BasicNameValuePair("userName", name));
                      pairs.add(new BasicNameValuePair("password", password));                            
                  }                  


                  int timeoutConnection = 3000;
                  HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
                  // Set the default socket timeout (SO_TIMEOUT) 
                  // in milliseconds which is the timeout for waiting for data.
                  httppost.setEntity(new UrlEncodedFormEntity(pairs));
                  HttpResponse response = httpClient.execute(httppost);                           
                  HttpEntity entity = response.getEntity();
                  final InputStream is = entity.getContent();

                  Message message = new Message();
                  message.obj = is;
                  message.what = server.SUCCESS;
                  handler.sendMessage(message);
          }catch(Exception e){  
              Log.e("log_tag", "Error in http connection "   e.toString(), e);
              handler.sendEmptyMessage(server.FAILURE);
          }           

   }
  

}

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

………………….

// Скомпилирован из DexFile.java (версия 1.5: 49.0, супер бит) общедоступный конечный класс dalvik.system.DexFile {

// Дескриптор метода # 8 (Ljava / io /File;)V // Stack: 3, Locals: 2 общедоступный файл DexFile (java.io .Файл file) вызывает исключение java.io.IOException; 0 aload_0 [this] 1 вызывает специальный java.lang.Object() [1] 4 новое исключение java.lang.RuntimeException [2] 7 дублирующий код 8 ldc [3] 10 вызывает специальное исключение java.lang.RuntimeException (java.lang.Строка) [4] 13 номеров строк в строке: [pc: 0, строка: 4] Таблица локальных переменных: [pc: 0, pc: 14] локальная: этот индекс: 0 тип: dalvik.system.DexFile [pc: 0, pc: 14] локальный: индекс файла: 1 тип: java.io.File

// Дескриптор метода # 18 (Ljava /lang /String;)V // Stack: 3, Locals: 2 общедоступный файл DexFile (java.lang.Строковое имя файла) вызывает исключение java.io.IOException; 0 aload_0 [this] 1 вызывает специальный java.lang.Object() [1] 4 новое исключение java.lang.RuntimeException [2] 7 дублирующий код 8 ldc [3] 10 вызывает специальное исключение java.lang.RuntimeException (java.lang.Строка) [4] 13 номеров строк в строке: [pc: 0, строка: 5] Таблица локальных переменных: [pc: 0, pc: 14] локальная: этот индекс: 0 тип: dalvik.system.DexFile [pc: 0, pc: 14] local: индекс имени файла: 1 тип: java.lang.Строка

// Дескриптор метода # 22 (Ljava / lang /String;Ljava /lang /String; I)Ldalvik/system /DexFile; // Стек: 3, локальные: 3 общедоступных статических dalvik.system.DexFile loadDex(java.lang.Строковый путь к источнику, java.lang.String outputPathName, флаги int) вызывает исключение java.io.IOException; 0 новых исключений java.lang.RuntimeException [2] 3 dup 4 ldc [3] 6 вызывает специальное исключение java.lang.RuntimeException (java.lang.Строка) [4] 9 номеров строк в строке: [pc: 0, строка: 6] Таблица локальных переменных: [pc: 0, pc: 10] local: sourcePathName индекс: 0 тип: java.lang.Строка [pc: 0, pc: 10] локальная: outputPathName индекс: 1 тип: java.lang.Строка [pc: 0, pc: 10] local: flags индекс: 2 тип: int

// Дескриптор метода #28 ()Ljava/lang /String; // Стек: 3, локальные: 1 общедоступный java.lang.String getName(); 0 новое исключение java.lang.RuntimeException [2] 3 dup 4 ldc [3] 6 вызывает специальное исключение java.lang.RuntimeException(java.lang.Строка) [4] 9 номеров строк в строке: [pc: 0, строка: 7] Таблица локальных переменных: [pc: 0, pc: 10] локальная: этот индекс: 0 тип: dalvik.system.DexFile

// Дескриптор метода #30 () V // Stack: 3, Locals: 1 public void close() вызывает исключение java.io.IOException; 0 нового исключения java.lang.RuntimeException [2] 3 dup 4 ldc [3] 6 вызывает специальное исключение java.lang.RuntimeException(java.lang.Строка) [4] 9 номеров строк в строке: [pc: 0, строка: 8] Таблица локальных переменных: [pc: 0, pc: 10] локальная: этот индекс: 0 тип: dalvik.system.DexFile

// Дескриптор метода # 32 (Ljava / lang /String;Ljava /lang /ClassLoader;)Ljava /lang /Class; // Стек: 3, локальные файлы: 3 общедоступных java.lang.Класс loadClass(java.lang.Имя строки, java.lang.Загрузчик ClassLoader); 0 новое исключение java.lang.RuntimeException [2] 3 dup 4 ldc [3] 6 вызывает специальное исключение java.lang.RuntimeException (java.lang.Строка) [4] 9 номеров строк подряд: [pc: 0, строка: 9] Таблица локальных переменных: [pc: 0, pc: 10] локальная: этот индекс: 0 тип: dalvik.system.Файл DexFile [pc: 0, pc: 10] локальный: индекс имени: 1 тип: java.lang.Строка [pc: 0, pc: 10] локальная: индекс загрузчика: 2 тип: java.lang.Загрузчик классов

// Дескриптор метода #37 ()Ljava/util /Перечисление; // Подпись: ()Ljava /util / Перечисление; // Стек: 3, локальные: 1 общедоступный java.util.Записи перечисления (); 0 новое исключение java.lang.RuntimeException [2] 3 dup 4 ldc [3] 6 вызывает специальное исключение java.lang.RuntimeException (java.lang.Строка) [4] 9 номеров строк в строке: [pc: 0, строка: 10] Таблица локальных переменных: [pc: 0, pc: 10] локальная: этот индекс: 0 тип: dalvik.system.DexFile

// Дескриптор метода #30 () V // Stack: 3, Locals: 1 protected void finalize() вызывает исключение java.io.IOException; 0 нового исключения java.lang.RuntimeException [2] 3 dup 4 ldc [3] 6 вызывает специальное исключение java.lang.RuntimeException(java.lang.Строка) [4] 9 номеров строк в строке: [pc: 0, строка: 11] Таблица локальных переменных: [pc: 0, pc: 10] локальная: этот индекс: 0 тип: dalvik.system.DexFile

// Дескриптор метода #42 (Ljava /lang /String;)Z общедоступное статическое собственное логическое значение isDexOptNeeded(java.lang.Строка arg0) вызывает исключение java.io.FileNotFoundException, java.io.IOException; }

Комментарии:

1. можете ли вы опубликовать код для метода showProgressDialog().

2. public void showProgressDialog(){ mDialog = ProgressDialog.show(server.this, «», «Пожалуйста, подождите …», true); mDialog.setCancelable(false); }

Ответ №1:

Не вызывайте thread.run() но thread.start() .

run() вызывает функцию run() в том же потоке. start() вызовет его в новом потоке. в настоящее время поток GUI заблокирован, поскольку он выполняет действие, которое должно быть выполнено в фоновом потоке.

Вы можете либо вызвать поток с помощью:

 Thread thread = new Thread(new loginThread(serverURL, name, password,getMyIMENumber()));
thread.start();
  

Или сделайте ваш loginThread расширенным потоком вместо реализации Runnable.

Комментарии:

1. Метод start() не определен для типа loginThread, вызывающего эту ошибку

2. public void start (){ this.run(); } я добавил это, чтобы запустить работу

3. «да, вы сделали» что? мое предложение или то, что вы прокомментировали?

4. теперь loginThread расширяет поток …. и я использую loginThread.start(); все та же проблема, я не смог увидеть диалоговое окно прогресса

5. Чем не получать ответ, используя этот метод, вместо этого используйте обработчик для получения этой информации из потока. Есть много хороших руководств по использованию обработчиков, загляните в SO, и у вас будет то, что вам нужно.

Ответ №2:

Вы сразу извлекаете InputStream из своего потока, более чем вероятно, что оно по-прежнему равно null или имеет свое начальное значение, HTTP-ответ еще не получен. Таким образом, ваше диалоговое окно выполнения отображается не более чем на несколько миллисекунд.

Завершите работу loginRequest после вызова thread.start() и из run метода вашего потока сообщите, получили ли вы результат или какое-либо исключение из потока пользовательского интерфейса, используя Handler . handleMessage Проверьте в обработчике результат loginRequest (поток ввода результата было бы лучше передать обработчику напрямую, чем извлекать его из потока) и удалите диалоговое окно выполнения.

Обновление Вот пример того, как достичь желаемого с помощью потоков:
В приведенном ниже коде ваше основное действие указано как LoginActivity (поскольку я не знаю названия вашего класса), поэтому вам следует изменить его на любое название класса java activity, в котором у вас есть loginRequest метод.

Удалите showProgressDialog() метод из вашего основного действия и вместо этого поместите:

 public static final int FAILURE = 0;
public static final int SUCCESS = 1;
private ProgressDialog dialog;

private Handler handler = new Handler()
{
    @Override
    public void handleMessage(Message msg)
    {
        removeDialog(0);
        switch (msg.what)
        {
            case SUCCESS:
                Log.i("LoginActivity", "Got inputstream");
                final InputStream is = (InputStream)msg.obj;
                if (is != null)
                {
                    //TODO: examine the input stream, etc...
                }
                break;
            case FAILURE:
                Log.i("LoginActivity", "Login failed");
                //TODO: Failure handling
                break;
            default:
                break;
        }
    }
};

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

public void loginRequest(String name, String password)
{
    showDialog(0);
    LoginThread thread = new LoginThread(serverURL, name, password, 
        getMyIMENumber(), handler);
    thread.start();
}
  

Обратите внимание, что loginRequest метод изменился!
Как и ваш LoginThread класс:

 public class LoginThread extends Thread
{

    private final String name;
    private final String password;
    private final String url;
    private final String ime;
    private final Handler handler;

    public LoginThread(String Url, String name, String password, 
        String ime, final Handler handler)
    {
        this.name = name;
        this.url = Url;
        this.password = password;
        this.ime = ime;
        this.handler = handler;
    }

    public void run()
    {
        try
        {
            HttpClient httpClient = new DefaultHttpClient();
            String loginURL = url   "member/login";
            HttpPost httppost = new HttpPost(loginURL);
            HttpParams httpParameters = new BasicHttpParams();
            List<NameValuePair> pairs = new ArrayList<NameValuePair>();
            if (name.contentEquals(""))
            {
                pairs.add(new BasicNameValuePair("ime", ime));
            }
            else
            {
                pairs.add(new BasicNameValuePair("userName", name));
                pairs.add(new BasicNameValuePair("password", password));
            }

            int timeoutConnection = 3000;
            HttpConnectionParams.setConnectionTimeout(httpParameters, 
                timeoutConnection);
            // Set the default socket timeout (SO_TIMEOUT)
            // in milliseconds which is the timeout for waiting for data.
            httppost.setEntity(new UrlEncodedFormEntity(pairs));
            HttpResponse response = httpClient.execute(httppost);
            HttpEntity entity = response.getEntity();
            final InputStream is = entity.getContent();

            Message message = new Message();
            message.obj = is;
            message.what = LoginActivity.SUCCESS;
            handler.sendMessage(message);
        }
        catch (Exception e)
        {
            Log.e("log_tag", "Error in http connection "   e.toString(), e);
            handler.sendEmptyMessage(LoginActivity.FAILURE);
        }
    }
}
  

Теперь у вашего LoginThread экземпляра появился новый элемент типа Handler . Он инициализируется с помощью параметра конструктора (как и другие), поэтому вы можете его объявить final .
Этот обработчик уведомит ваш поток пользовательского интерфейса (основное действие), если он получил входной поток из http-ответа или если по какой-либо причине произошел сбой.
Завершите Handler реализацию, чтобы заставить ее делать то, что вам нужно.

Я надеюсь, что код немного прояснил этот подход.

Комментарии:

1. не могли бы вы объяснить мне это, пожалуйста

2. большое вам спасибо, это понятно, я собираюсь попробовать это… сообщит вам результат.

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

4. // Скомпилирован из DexFile.java (версия 1.5: 49.0, супер бит) общедоступный конечный класс dalvik.system. DexFile { // Дескриптор метода #8 (Ljava / io /File;)V // Stack: 3, Locals: 2 общедоступный файл DexFile (java.io . Файл file) вызывает исключение java.io.IOException; 0 новых исключений java.lang.RuntimeException [2]

5. // Stack: 3, Locals: 2 общедоступный файл DexFile (java.io . Файл file) вызывает исключение java.io.IOException; 0 aload_0 [this] 1 вызывает специальный java.lang. Object() [1] 4 новое исключение java.lang.RuntimeException [2] 7 дублирующий 8 ldc <Строка «Заглушка!»> [3] 10 вызывает специальное исключение java.lang.RuntimeException(java.lang. Строка) [4] 13 номеров строк в строке: [pc: 0, строка: 4] Таблица локальных переменных: [pc: 0, pc: 14] локальная: этот индекс: 0 тип: dalvik.system. DexFile [pc: 0, pc: 14] локальный: индекс файла: 1 тип: java.io . Дескриптор файла / / метода # 18 (Ljava / lang / Str

Ответ №3:

до тех пор, пока вы не вызовете метод show в диалоговом окне выполнения, он не будет отображаться.

 do this in your showProgressDialog method -- mDialog.show();
  

Комментарии:

1. Самый простой способ выполнить такого рода операции — использовать AsyncTask. Используйте onPreExecute (), чтобы отобразить ваш ProgressDialog, doInBackground, чтобы выполнить свои задачи, и onPostExecute, чтобы закрыть ваш ProgressDialog. — brighthub.com/mobile/google-android/articles/82805.aspx