Android Callable

Как реализовать 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);
}

3 ответа

Вы можете использовать Callable в Android, как и в любой другой 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

вам также придется ловить ExecutionException, InterruptedException

как и в ответе Ларри Шифера, вы должны искать другие - более ориентированные на Android решения, чтобы сделать это. Если вам нужно поддерживать FTP-соединение, то, возможно, Service будет лучше, если вам нужно только получить результаты, тогда AsyncTask или AsyncTaskLoader

Изучите использование любого AsyncTask, Loader или же Handler объекты для достижения этой цели.

Другие вопросы по тегам