如何实现 Callable 返回布尔值并做某事?
我需要使用外部线程连接到FTP服务器,我无法在主活动中执行此操作,我需要返回值才能知道它是否已连接;
[主要活动]
public class doSomething implements Callable<Boolean> {
@Override
public Boolean call() throws Exception {
// TODO something...
return value;
}
}
public void onClick(View view) {
ExecutorService executor = Executors.newFixedThreadPool(1);
FutureTask<Boolean> futureTask = new FutureTask<Boolean>(new doSomething());
executor.execute(futureTask);
}
您可以在Android中使用Callable,就像在任何其他Java程序中一样,即
ExecutorService executor = Executors.newFixedThreadPool(1);
final Future<Boolean> result = executor.submit(callable);
boolean value = result.get()
但请注意,get() 方法会阻塞主线程,这是不推荐的。
对于您的用例,您应该改用 AsyncTask。例如
public class FTPConnection extends AsyncTask<Void, Void, Boolean> {
@Override
protected boolean doInBackground(Void... params) {
//Connect to FTP
}
@Override
protected void onPostExecute(boolean connected) {
//Take action based on result
}
}
你应该:
static public class doSomething implements Callable<Boolean> {
@Override
public Boolean call() throws Exception {
// TODO something...
return Boolean.FALSE;
}
}
doSomething task = new doSomething ();
Future<Boolean> future = executor.submit(task);
Boolean res = future.get(); // get() will block waiting for result, so dont call it on UI thread
您还必须捕获执行异常,中断异常
正如Larry Schiefer的回答一样,您应该研究其他 - 更面向Android的解决方案来完善它。如果您需要维护FTP连接,那么也许服务会更好,如果您只需要获得结果,那么AsyncTask或AsyncTaskLoader
研究使用AsyncTask
、Loader
或Handler
对象来实现此目的。