1

我想知道是否有一种从正在运行的线程返回对象的好方法。在我的android项目中(对于这个问题并不重要)我有这个方法:

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();
}

此方法从 Internet 获取一些数据并将结果存储在List<File> result. 这就是为什么我不想在 UI 线程中运行它。现在我想将此列表返回到我的主要方法。做这个的最好方式是什么?

4

2 回答 2

5
public interface Callable<V>

返回结果并可能引发异常的任务。实现者定义了一个没有参数的方法,称为 call。

Callable接口类似于Runnable,因为两者都是为实例可能由另一个线程执行的类设计的。但是, ARunnable不返回结果,也不能抛出检查异常。

如何使用可调用

编辑: 您还应该在 android 中使用AsyncTask来执行后台任务,而不是创建自己的线程。

于 2013-09-14T16:12:03.570 回答
1

您应该使用Callable接口而不是Runnable接口来创建线程。Callable接口提供了一个call()方法,该方法可以返回一个Object.

因为您不能将 a 传递给Callable线程来执行,所以您可以使用ExecutorService来执行Callable对象。该服务Callable通过以下方法接受要运行的对象submit()

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

如方法定义所示,将Callable对象提交给ExecutorService返回一个 Future 对象。然后 Future的get()方法将阻塞,直到任务完成。

您可以按照此链接上的示例并根据您的要求对其进行自定义:

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

于 2013-09-14T16:13:02.460 回答