Android Callable

时间:2014-01-08 17:08:09

标签: java android callable executor

如何实现Callable返回布尔值并执行某些操作?

我需要使用外部线程连接到FTP服务器,我不能在主要活动中执行此操作,我需要返回值才能知道它是否已连接;

[MainActivity]

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

3 个答案:

答案 0 :(得分:7)

您可以像在任何其他Java程序中一样使用Android中的Callable,即

    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
    }
}

答案 1 :(得分:3)

你应该:

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

你还必须捕获ExecutionException,InterruptedException

在Larry Schiefer的回答中,你应该研究其他 - 更多面向Android的解决方案来实现它。如果您需要维护FTP连接,那么可能服务会更好,如果您只需要获得结果,那么AsyncTask或AsyncTaskLoader

答案 2 :(得分:0)

使用AsyncTaskLoaderHandler个对象来实现此目标。