Java Android: отправка данных из одного потока в другой поток - PullRequest
1 голос
/ 26 февраля 2012

Я работаю над Android UI Thread, и на это уходит много времени, поэтому я поместил его в другой поток.Есть две вещи, которые я хочу:

1) после выполнения этого подпотока поток пользовательского интерфейса начнет выполнять работу A

2) эта работа A будет принимать некоторые данные, которые создаются в подпотоке.

Вот мое решение:

Car car;    
public void onResume(){
        super.onResume();   
        Thread t = new Thread(){
                car = new Car();
                car.takePetrol;   //take car full petrol
            }
        });

        t.join();
        count_How_far_Car_can_go(car.getPetrol);        

}

Проблема в моем коде такова: я использую t.join ();ждать нить т закончить.И это «заблокирует» поток пользовательского интерфейса.Конечно, это не то, что я хочу.(потому что я создаю другой поток, чтобы поток пользовательского интерфейса все еще мог работать бесперебойно)

У кого есть другое решение для моей проблемы, пожалуйста, помогите мне:)

спасибо:)

Ответы [ 3 ]

3 голосов
/ 26 февраля 2012

Проверьте AsyncTask класс из android.os.AsyncTask пакета.

РЕДАКТИРОВАТЬ: Извините за быстрый ответ.Я улучшил его в соответствии с потребностями OP.

private class MyTask extends AsyncTask<Void, Void, Car> {
        @Override
        protected Car doInBackground() {
            // Create your Car here
            return car;
        }

        @Override
        protected void onPostExecute(Car car) {
            // This will be executed on UI thread after completion
        }
}

И запускаю его следующим образом

MyTask task = new MyTask();
task.execute();

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

private class MyTaskWithParams extends AsyncTask<String, Void, Car> {
        @Override
        protected Car doInBackground(String parameter) {
            // Create your Car using the String you passed
            return car;
        }

        @Override
        protected void onPostExecute(Car car) {
            // This will be executed on UI thread after completion
        }
}

С добавленным в определение параметром вы должны создать экземпляр с помощью

MyTask2 task2 = new MyTask2();
task2.execute("SomethingSomething");
1 голос
/ 26 февраля 2012

Используйте AsyncTask и вставьте ...

car = new Car();
car.takePetrol;   //take car full petrol

... в метод doInBackground.После этого вызывается метод onPostExecute, и вы можете выполнить там «workA».

0 голосов
/ 27 февраля 2012

ConditionVariable & ExecutorService больше подходит для этой сцены. см. Здесь для блога Android

...