Android - асинтаск, индикатор выполнения и ввод-вывод

Извините, что задаю вопрос, аналогичный моему предыдущему, но я просто не могу понять это.

Я использовал простой пример "ping", который я нашел здесь и просто хотел добавить ProgressBar, но без удача. Я действительно не понимаю, что происходит.

Итак, это отлично работает:

    protected void onPreExecute() {
    sb = new StringBuilder();
    mPOut = new PipedOutputStream();
    try {
        mPIn = new PipedInputStream(mPOut);
        mReader = new LineNumberReader(new InputStreamReader(mPIn));
    } catch (IOException e) {
        cancel(true);
    }
    //myBar.setVisibility(View.VISIBLE); -> PROBLEM!!!
}

protected Object doInBackground(Object... arg0) {
    try {
        process = Runtime.getRuntime().exec("ping -c 4 " + ipadd);
        InputStream in = process.getInputStream();
        OutputStream out = process.getOutputStream();
        byte[] buffer = new byte[1024];
        int count;
        while ((count = in.read(buffer)) != -1) {
            mPOut.write(buffer, 0, count);
            String bs= new String(buffer);
            publishProgress(); 
        }
        in.close();
        out.close();
        mPOut.close();
        mPIn.close();
    } catch (IOException e) {
    }
    return null;
}

protected void onPostExecute(Object result) {
            myBar.setVisibility(View.INVISIBLE);
            tv.setText(sb);
            System.out.println(sb);
}

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

Если я удалю комментарий из строки, которую я пометил как проблему (установлю видимость индикатора выполнения), я просто не получу вывод от ping. Мне кажется, что это как-то портит мой ввод-вывод или что-то в этом роде. ProgressBar отображается и скрывается в конце, но не выводится.

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

Спасибо!!!


person newman555p    schedule 02.09.2012    source источник
comment
возможный дубликат Progressbar вместе с asyncTask   -  person Siddharth Lele    schedule 23.01.2013


Ответы (2)


Попробуйте программно создать ProgressDialog в методе OnPreExecute() и отклоните его после завершения задачи в onPostExecute(). Вот код:

add to onPreExcute:
    super.onPreExecute();
    ProgressDialog pDialog = new ProgressDialog(YourActivity.this);
        pDialog.setMessage("Please wait...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();

add to onPostExecute:
   pDialog.dismiss();
person Marcin S.    schedule 02.09.2012
comment
Извините за поздний ответ, но я только что попробовал, и это не работает. То же самое, что и при использовании индикатора выполнения. Диалог отображается, а затем скрывается, но вывод команды ping shell не осуществляется. - person newman555p; 02.09.2012

Вы переопределили onProgressUpdate? Если не переопределить onProgressUpdate, как показано ниже, и обновить индикатор выполнения/текстовое представление, что вы хотите в этом методе.

@Override
protected void onProgressUpdate(String... values) {
    //update your progressbar here
someView.setText(values[0]);    
}

из вашего кода видно, что вы вызвали publishProgress, но не передаете никакого значения. Просто передайте значение bs, которое вы получаете, например:

publishProgress(bs);

и обновите индикатор выполнения, указав значение bs.

person Abhishek Nandi    schedule 26.10.2012