Задача не завершена и запрещает обновление TextView - PullRequest
0 голосов
/ 08 марта 2011

Сейчас я работаю над приложением для Android, в котором мне нужно отобразить текст после некоторой обработки. Я использую поток, чтобы запустить процесс сзади, пока мой диалог прогресса отображается для пользователя. Поток работает правильно, и я следовал за ним шаг за шагом, и, видимо, он также заканчивается нормально; однако, метод, в котором я его называю, кажется, не заканчивается (по крайней мере, во время обычного цикла), потому что текст, который я задаю позже, отображается немедленно, я должен подождать и выполнить какое-то другое действие (как в для отображения

Ниже приведен фрагмент кода, с которым у меня возникают проблемы:

private OnClickListener saldoDisp = new OnClickListener(){
    public void onClick(View v){
        int x = s2.getSelectedItemPosition();
        branchSel = arrSucsId[x];
        mainProc();
             saldoAdminTex.setText(strSaldo);  //The late one
    }
};    

public void mainProc(){
    chekP = new Thread (null,doProc,"Background");
    chekP.start();
    mProgress =ProgressDialog.show(SivetaAsaldo.this, "","Obteniendo saldo...",true, false);    
}

private Runnable doProc = new Runnable(){
    public void run(){
        if(getSaldoAdmin(levelSel,branchSel))
        {
            mProgress.dismis();
                    Log.i(TAG,"Task completed properly");
        }else       
            handler.post(tosti);
    }
};

Итак, я получаю «Задание выполнено правильно», но кажется, что оно все еще ждет чего-то другого, какие-нибудь подсказки, ребята? Спасибо, что уделили немного времени, чтобы проверить это =).

Ответы [ 3 ]

1 голос
/ 08 марта 2011
saldoAdminTex.setText(strSaldo);  //The late one

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

Это поможет вам прочитать статью о Потоки без боли на сайте Android Dev.

0 голосов
/ 08 марта 2011

Глядя на ваш код, это:

saldoAdminTex.setText(strSaldo);

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

Альтернативным способом будетДля этого:

public void mainProc(){
    mProgress =ProgressDialog.show(SivetaAsaldo.this, "","Obteniendo saldo...",true,false);
    handler.post(new Runable(){
    public void run(){
        if(getSaldoAdmin(levelSel,branchSel))
        {
            mProgress.dismis();
            saldoAdminTex.setText(strSaldo); 
            Log.i(TAG,"Task completed properly");
        }else       
            handler.post(tosti);
    }
 });
}
0 голосов
/ 08 марта 2011

О вашем ProgressDialog, см. этот ответ о том, как использовать AsyncTask с ProgressDialog.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...