Java 在另一个线程中执行侦听器

Java 在另一个线程中执行侦听器,java,android,multithreading,synchronize,Java,Android,Multithreading,Synchronize,我想用android做点什么。。。这是我以前做过的事,但以另一种方式。目标是下载几个图像,然后在主线程中显示(是的,我的意思是与处理程序、asynctask或类似的东西同步,没有问题。但是…这样做有一个问题。请看下面的代码片段,解释发生了什么(OnAtach): @覆盖 公共事务主任(活动){ 超级转速计(活动); Log.d(MainActivity.TAG,“附加上的线程id:+thread.currentThread().getId());//它返回线程id:1 Runnable r=新的

我想用android做点什么。。。这是我以前做过的事,但以另一种方式。目标是下载几个图像,然后在主线程中显示(是的,我的意思是与处理程序、asynctask或类似的东西同步,没有问题。但是…这样做有一个问题。请看下面的代码片段,解释发生了什么(OnAtach):

@覆盖
公共事务主任(活动){
超级转速计(活动);
Log.d(MainActivity.TAG,“附加上的线程id:+thread.currentThread().getId());//它返回线程id:1
Runnable r=新的Runnable(){
@凌驾
公开募捐{
squry=newserverquery();
mQueue=Volley.newRequestQueue(getActivity());
Log.d(MainActivity.TAG,“inside runnable:+Thread.currentThread().getId());//它返回2200或类似的值……似乎是逻辑,另一个线程
mQueue.add(sQuery.getThumbs(“1”),
新的Response.Listener(){
@凌驾
公共void onResponse(JSONArray响应){
Log.d(MainActivity.TAG,“内部侦听器:”+Thread.currentThread().getId());//什么?返回线程1!所以我无法在后台执行此操作……为什么会发生这种情况?
}
}));
}
};
螺纹t=新螺纹(r);
t、 start();
试一试{
t、 join();
}捕捉(中断异常e){
e、 printStackTrace();
}
}
好的,这只是一个线程,在它的线程中定义了一个监听器,但是…为什么监听器是在UI线程上执行的?(所以,即使我使用join(),join()只是一个调试测试,但是图像库是在没有下载图像的情况下创建的,我不能下载任何东西,因为它是主线程!)
还有……您认为如何使用处理程序或类似的东西来同步它?或者您会使用什么?

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

谢谢您的回答,是的,发生这种情况是因为线程结束,然后显示图像(我们还没有图像),然后下载图像!但是如果我在运行()结束时使用wait(),它抛出一个异常:java.lang.IllegalMonitorStateException:对象在等待之前未被线程锁定()如果你每次进入监听器时都创建一个新线程?因为执行监听器的人是监听器的调用者。你是在主线程中调用onResponse吗?是的,谢谢,这就是我所做的,它起了作用,因为每次都创建线程,我也使用view.post()若要添加代码以刷新库内容,我认为您必须在此处使用asynctask。
    @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();
    }
}