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
объекты для достижения этой цели.