arodrprope
arodrprope

Reputation: 51

Various threads

i'm trying create a thread, which return a value, the process is running correctly but my screen is still locked. I want a thread that return a value but my main thread continues running.

I've done that:

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

Upvotes: 0

Views: 53

Answers (1)

adushenin
adushenin

Reputation: 269

partidas.get() action is the cause that main thread is waiting for the completion of Callable method in executor. If you want main thread are still running during Callable action execution you must place partidas.get() action into dedicated separate thread e.g.:

replace

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

into

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

or similar action with threads (maybe using executor, Runnable, etc).

Or you can change you logic (if possible) and hide call to method from Callable into Runnable class. E,g.:

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

Upvotes: 1

Related Questions