我想知道是否有一种从正在运行的线程返回对象的好方法。 在我的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();
}
此方法从互联网上抓取一些数据并将结果存储在List<File> result
中。这就是为什么我不想在UI线程中运行它。现在我想将此List返回给我的main方法。这样做的最佳方式是什么?
答案 0 :(得分:4)
public interface Callable<V>
返回结果并可能抛出异常的任务。实现者定义一个没有参数的单个方法,称为call。
Callable
接口类似于Runnable
,因为它们都是为其实例可能由另一个线程执行的类而设计的。但是,Runnable
不返回结果,也不能抛出已检查的异常。
修改强> 此外,您应该在android中使用AsyncTask来执行后台任务,而不是创建自己的线程。
答案 1 :(得分:1)
您应该使用Callable
接口而不是Runnable
接口来创建线程。 Callable
界面提供了call()
方法,该方法可以返回Object
。
因为您无法将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