Различные потоки

Я пытаюсь создать поток, который возвращает значение, процесс работает правильно, но мой экран все еще заблокирован. Мне нужен поток, который возвращает значение, но мой основной поток продолжает работать.

Я сделал это:

public void showPartidas(int maximumDistance){
 ExecutorService es = Executors.newFixedThreadPool(1);
 Future<arraylist<partida>> partidas= es.submit(new FilterPartidas(maximumDistance));
 try {
 loadInListView(partidas.get());
 } catch (InterruptedException e) {
 e.printStackTrace();
 } catch (ExecutionException e) {
 e.printStackTrace();
 }

 es.shutdown();
}




class FilterPartidas implements Callable<arraylist<partida> > {

 private final int distance;
 private ArrayList<partida> partidas;

 FilterPartidas(int distance) {
 this.distance = distance;
 }

 @Override
 public ArrayList<partida> call() throws Exception {
 partidas=null;
 Download load = new Download();
 Date fecha = new Date();
 DateFormat fechaFormat = new SimpleDateFormat("yyyy-MM-dd");
 String query = "select * from partidas where fecha >='"+fechaFormat.format(fecha)+"'";
 partidas=load.obtainPartidas(query, distance, myPosition);
 return partidas;
 }
}
</partida></partida></arraylist<partida></arraylist<partida>
1 ответ

Действие partidas.get() является причиной того, что основной поток ожидает завершения метода Callable в исполнителе. Если вы хотите, чтобы основной поток все еще выполнялся во время выполнения действия Callable, вы должны поместить действие partidas.get() в отдельный отдельный поток, например:

замещать

Future<arraylist<partida>> partidas= es.submit(new FilterPartidas(maximumDistance));
 try {
 loadInListView(partidas.get());
 } catch (InterruptedException e) {
 e.printStackTrace();
 } catch (ExecutionException e) {
 e.printStackTrace();
 }
</arraylist<partida>

в

final Future<arraylist<partida>> partidas= es.submit(new FilterPartidas(maximumDistance));
 new Thread(new Runnable() {
 @Override
 public void run() {
 try {
 loadInListView(partidas.get());
 } catch (InterruptedEArrayList<partida>xception e) {
 e.printStackTrace();
 } catch (ExecutionException e) {
 e.printStackTrace();
 }
 }
 }).start();
</partida></arraylist<partida>

или подобное действие с потоками (возможно, с использованием исполнителей, Runnable и т.д.).

Или вы можете поменять логику (если возможно) и скрыть вызов метода из класса Callable в Runnable. Например.:

ExecutorService es = Executors.newFixedThreadPool(1);
es.submit(new Runnable() {
 @Override
 public void run() {
 ArrayList<partida> partidas = logic from you Callable call;
 loadInListView(partidas);
 }
});
</partida>

licensed under cc by-sa 3.0 with attribution.