在另一个线程中执行Listener

时间:2014-05-11 16:29:12

标签: java android multithreading synchronize

我试图在Android上做点什么...我之前做过的事情,但以其他方式。目标是下载一些图像,然后在主线程中显示它(是的,我的意思是与处理程序同步,asynctask或类似的东西,没问题。但是......有一个问题要做到这一点。看看这个片段解释会发生什么(onAttach):

    @Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    Log.d(MainActivity.TAG,"thread id on attach:" + Thread.currentThread().getId()); //it return thread ID:1
    Runnable r = new Runnable(){
        @Override
        public void run() {
            sQuery = new ServerQuery();
            mQueue = Volley.newRequestQueue(getActivity());
            Log.d(MainActivity.TAG,"inside runnable:" + Thread.currentThread().getId()); //it returns 2200 or something like that... it seems logic, another thread
            mQueue.add(sQuery.getThumbs("1",
                    new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    Log.d(MainActivity.TAG,"inside listener:" + Thread.currentThread().getId()); //what?? returns thread 1! so i can't execute this on background... why it happens?
                }
            }));
        }

    };
    Thread t = new Thread(r);
    t.start();
    try {
        t.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

好吧,这只是创建一个线程并且在其线程内部定义了一个监听器,但是......为什么监听器在UI线程上执行? (所以,即使我使用join(),join()只是一个调试测试,但是图像库是在没有下载图像的情况下创建的,我不能下载任何东西,因为它是主线程!) 并且......您如何看待使用处理程序或类似的东西来同步它?或者你会用什么?

1 个答案:

答案 0 :(得分:0)

如果每次进入监听器时都创建一个新线程? 因为谁执行监听器是监听器的调用者。

相关问题