2014-05-11 3 views
0

나는 전에 한 작업이지만 다른 방법으로 작업을 수행했습니다. 목표는 두 개의 이미지를 다운로드 한 다음 주 스레드에 표시하는 것입니다 (예, 처리기, 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()은 디버깅을위한 테스트 일 뿐이지 만 이미지 갤러리는 다운로드 한 이미지없이 만들어지고 주 스레드이므로 아무 것도 다운로드 할 수 없습니다!) 그리고 ... 당신은 무엇을합니까? 핸들러 또는 이와 유사한 것을 사용하여 동기화 할 것인가? 아니면 무엇을 사용할 것입니까?

+0

여기 asynctask를 사용해야한다고 생각합니다. – Suraj

답변

0

그리고 리스너에 입력 할 때마다 새 스레드를 만드시겠습니까? 누가 리스너를 실행하는지는 리스너의 호출자입니다.

+0

답장을 보내 주셔서 감사합니다. 예, 스레드가 종료되어 이미지가 표시되고 (아직 이미지가 없음) 이미지가 다운로드되므로 문제가 발생합니다. 하지만 run() 끝에서 wait()를 사용하면 예외가 throw됩니다. java.lang.IllegalMonitorStateException : 스레드가 wait() 전에 스레드에서 잠기지 않았습니다. – harrier

+0

그리고 새 스레드를 만들 때마다 경청자? 청취자를 실행하는 사람은 청취자의 발신자이기 때문에 생각합니다. 메인 스레드에서 onResponse를 호출하고 있습니까? – RuiOliveiras

+0

그래, 고마워, 내가 뭘했는지 그리고 스레드가 매번 만들어지기 때문에 일 했어. 또한 view.post()를 사용하여 갤러리 내용을 새로 고치는 코드를 추가했다. – harrier