Передать сообщение из потока для обновления пользовательского интерфейса - PullRequest
4 голосов
/ 16 января 2011

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

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

public class New_Project extends Activity implements Runnable {

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            Log.d("New Thread","Proccess Complete.");
            Intent intent = new Intent();
            setResult(RESULT_OK, intent);
            finish();
        }
    };


    public void fileScanner(){
        //if (!XMLEFunctions.canReadExternal(this)) return;
        pd = ProgressDialog.show(this, "Reading Directory.",
                "Please Wait...", true, false);

        Log.d("New Thread","Called");
        Thread thread = new Thread(this);
        thread.start();
    }


    public void run() {
        Log.d("New Thread","Reading Files");
        getFiles();
        handler.sendEmptyMessage(0);
    }


    public void getFiles() {
        for (int i=0;i<=allFiles.length-1;i++){
            //I WANT TO PASS THE FILE PATH BACK TU A HANDLER IN THE UI
            //SO IT CAN BE DRAWN.
            **passFilePathBackToBeDrawn(allFiles[i].toString());**
        } 
    }

}

Ответы [ 2 ]

16 голосов
/ 16 января 2011

Кажется, что передача простых сообщений основана на int ... Мне нужно было передать Bundle

using Message.setData(Bundle) and Message.getData(Bundle)

Так счастлив = 0)

//Function From Within The Thread

public void newProjectCreation() {

Message msg =  new Message();
Bundle bundle = new Bundle();

bundle.putString("Test", "test value");
msg.setData(bundle);

handler2.sendMessage(msg);
}

//Handler in The UI Thread Retreieves The Data
//And Can Update the GUI as Required

private Handler handler2 = new Handler() {
    @Override
    public void handleMessage(Message msg) {

    Bundle bundle = msg.getData();
    Toast.makeText(New_Project.this,bundle.getString("Test"),Toast.LENGTH_SHORT).show();

}

};
3 голосов
/ 16 января 2011

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

http://developer.android.com/reference/android/os/AsyncTask.html

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