2013-09-14 4 views
1

Мне интересно, есть ли способ вернуть объект из работающего потока. В моем андроида проекте (не важно для вопроса) У меня есть этот метод:Обратный объект из темы

public void getFolders() 
{ 
    Thread t = new Thread(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      List<File> result = new ArrayList<File>(); 
      Files.List request = null; 

      do 
      { 
       try 
       { 
        request = service.files().list(); 
        request.setQ("'appdata' in parents"); 

        FileList files = request.execute(); 

        result.addAll(files.getItems()); 
        request.setPageToken(files.getNextPageToken()); 
       } 
       catch (IOException e) 
       { 
        System.out.println("An error occurred: " + e); 
        request.setPageToken(null); 
       } 
      } 
      while (request.getPageToken() != null && request.getPageToken().length() > 0); 
     } 
    }); 

    t.start(); 
} 

Этот метод захватывает некоторые данные из Интернета и сохранить результат в List<File> result. Вот почему я не хочу запускать его в потоке пользовательского интерфейса. Теперь я хочу вернуть этот список в мой основной метод. Каков наилучший способ сделать это?

+0

Вы пробовали 'интерфейс Callable' ?? – prasanth

+1

Может быть дублирован здесь http://stackoverflow.com/questions/9148899/returning-value-from-thread или здесь http://stackoverflow.com/questions/3141158/how-can-a-thread-return-a- value-after-finish-its-job – fujy

+0

Объявление 'List' как переменной экземпляра класса является одним из способов получить данные из списка –

ответ

4
public interface Callable<V> 

Задача, которая возвращает результат и может вызывать исключение. Разработчики определяют один метод без аргументов, называемых call.

Интерфейс Callable похож на Runnable, поскольку оба предназначены для классов, экземпляры которых потенциально выполняются другим потоком. A Runnable, однако, не возвращает результат и не может выставить проверенное исключение.

How to use Callable.

EDIT: Кроме того, вы должны использовать AsyncTask в андроиде для выполнения фоновых задач, а не создавать темы вашего собственные.

+0

Спасибо за это! Но у меня есть три метода, которые выглядят как выше. Как мне его использовать? – Cilenco

1

Интерфейс Callable вместо Runnable для создания потоков. Интерфейс Callable предлагает метод call(), который может возвращать Object.

Поскольку вы не можете передать Callable в Thread для выполнения, вместо этого вы используете ExecutorService для выполнения объекта Callable. Сервис принимает Callable объекты для запуска посредством метода submit():

<T> Future<T> submit(Callable<T> task) 

Как показывает определение метода, представив Callable объект к ExecutorService возвращается будущего объекта. Метод get() будущего будет блокироваться до завершения задачи.

Вы можете следить за образец на этой ссылке и настроить его в соответствии с вашими требованиями:

https://blogs.oracle.com/CoreJavaTechTips/entry/get_netbeans_6

Смежные вопросы