【问题标题】:passing diffrenet runnables or messages to a single predefined thread in android将不同的可运行或消息传递给android中的单个预定义线程
【发布时间】:2014-08-10 11:25:16
【问题描述】:

在我的初始屏幕中,我向我的服务器发送了两个不同的请求,我想等待结果然后解析它们,然后转到我的主要活动。我正在使用 volley,我想在 mThread 中解析两个结果,在确保我成功拥有我需要的所有内容之后,我调用 startActivity 和....所以我的问题是如何将两个不同的可运行对象发送到 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);

我将不胜感激任何实用且干净的解决方案!

【问题讨论】:

    标签: java android multithreading android-asynctask android-handler


    【解决方案1】:

    您可以使用执行器框架,使用它您可以创建一个包含一个线程的线程池。线程将等待任务(Runnables)执行。并且会一一执行。

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

    以这种方式发送任务:

    executorService.execute(new YourRunnable());
    

    如果您想同时执行多个任务,您还可以使用Executors.newFixedThreadPool(n) 创建一个 n 大小的线程池。或者如果您需要返回值,请提交Callable。这里有一点introduction

    还有GuavaLibrary 来实现任务完成时调用的回调。

    【讨论】:

    • 非常感谢,但是有一个问题,我如何检测到我已经完成了两个任务,以及如何在最后一个任务结束时调用 finsh(),我不知道是什么我的最后一项任务以及如何在另一个线程上调用完成?
    • 一种方法是将处理程序(在主线程中创建)传递给 Runnable executorService.execute(new Runnable(new Handler())。在 Runnable.run() 方法内部,当你完成你的操作时,使用handler.post() 将另一个runnable 发送到主线程的消息队列。 handler.post(new Runnable() {public void run() { //executes in the main thread }});
    • 我最后的任务是什么?我怎样才能检测到它通过 runnable?
    • 您可以简单地使用 handler.post() 增加一个计数器。或者实现一个ThreadPoolExecutor,它具有获取活动或已完成任务的方法。 stackoverflow.com/a/18985768/2017375
    【解决方案2】:

    您可以使用从 2 开始的 CountDownLatch。您的 mThread 调用 await() 方法,并且两个 HTTP 处理程序在它们传递了它们的部分结果后各自调用 countDown()

    【讨论】:

    • 谢谢,但我怎样才能将两个可运行文件传递给 mThread?我想在收到它们时在 mThread 中执行它们!!
    猜你喜欢
    • 2012-05-20
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    相关资源
    最近更新 更多