передача различных исполняемых модулей или сообщений в один предопределенный поток в Android

На моем экране-заставке я отправляю два разных запроса на свой сервер, и я хочу дождаться результатов, затем проанализировать их и после этого перейти к своей основной деятельности. я использую залп и хочу проанализировать два результата в mThread, и, убедившись, что у меня есть все, что мне нужно, я вызываю startActivity и .... поэтому моя проблема в том, как я могу отправить два разных runnables в mThread или как я отправляю свои строковые ответы в свой mThread, чтобы проанализировать его, и после последнего запуска или сообщения вызвать другое действие. а также как я могу вызвать метод завершения в конце? я рассматриваю этот вариант, но ничего не получается:

используя обработчик, но если я хочу использовать обработчик, как вы знаете, каждый обработчик назначается потоку, который его создал, поэтому создание обработчика в методе onCreate неправильно, потому что я хочу, чтобы мой поток заснул, если запросы еще не получены, а также не хочу выполнять свои вычисления в основном потоке.

и код, который я не знаю, как его решить:

  protected void onCreate(Bundle savedInstanceState) {
  // ....
  mThread = new Thread(){

        @Override
        public void run() {
            super.run();
            Log.i("Recieved String",response);
       if( two runnable completed){

            Intent i = new Intent(WelcomeActivity.this, MainActivity.class);
            startActivity(i);

          how to call finish()?

       }
     }

    };

 //... 

            MyVolleyRequest Request1 = new MyVolleyRequest(URL1, 
                new Response.Listener<String>() {

            @Override
            public void onResponse(String response) {
                // sending response to mThread
                // or sending runnable to mThread
            }
        }, 

        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError ex) {                               

            }
        });


           MyVolleyRequest Request2 = new MyVolleyRequest(URL2, 
                new Response.Listener<String>() {

            @Override
            public void onResponse(String response) {
                // sending response to mThread
                // or sending runnable to mThread
            }
        }, 

        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError ex) {                               

            }
        });

        SingletonRequestQueue.getInstance(SplashActivity.this).addToRequestQueue(Request1);
        SingletonRequestQueue.getInstance(SplashActivity.this).addToRequestQueue(Request2);

Я буду признателен за любое практичное и чистое решение!


person mmlooloo    schedule 10.08.2014    source источник


Ответы (2)


Вы можете использовать Executor Framework, с его помощью вы можете создать пул потоков, содержащий один поток. Поток будет ждать выполнения задач (Runnables). И собирается казнить их одного за другим.

private ExecutorService executorService;    
executorService = Executors.newSingleThreadExecutor();

отправить Задания таким образом:

executorService.execute(new YourRunnable());

Вы также можете создать пул потоков размером n, используя Executors.newFixedThreadPool(n), если хотите одновременно выполнять несколько задач. Или отправьте Callable, если вам нужно вернуть значение. Вот небольшое введение.

Существует также библиотека Guava для реализации обратных вызовов, вызываемых по завершении задач.

person ILovemyPoncho    schedule 10.08.2014
comment
Большое спасибо, но один вопрос: как я могу определить, что я закончил две задачи, и как я могу вызвать finsh() в конце моей последней задачи, я не знаю, что это моя последняя задача, а также как я могу завершить вызов в другом потоке? - person mmlooloo; 10.08.2014
comment
Способ сделать это — передать обработчик (созданный в основном потоке) в Runnable executorService.execute(new Runnable(new Handler()). Внутри метода Runnable.run(), когда вы закончите свои операции, используйте handler.post() для отправки другого исполняемого объекта в очередь сообщений основного потока. handler.post(new Runnable() {public void run() { //executes in the main thread }}); - person ILovemyPoncho; 10.08.2014
comment
какое мое последнее задание? как я могу обнаружить его, чтобы пройти runnable? - person mmlooloo; 10.08.2014
comment
Вы можете просто увеличить счетчик с помощью handler.post(). или реализовать вместо этого ThreadPoolExecutor, у которого есть методы для получения активных или завершенных задач. stackoverflow.com/a/18985768/2017375 - person ILovemyPoncho; 10.08.2014

Вы можете использовать CountDownLatch, начиная со счета 2. Ваш mThread вызывает метод await(), и каждый из обработчиков HTTP вызывает countDown() после того, как они доставили свою часть результата.

person Barend    schedule 10.08.2014
comment
спасибо, но как я могу передать два runnables в mThread? я хочу выполнить их в mThread, когда они будут получены !! - person mmlooloo; 10.08.2014