2012-04-10 2 views
0

나는 안드로이드의 주 UI 스레드가 절전 모드를 호출해서는 안된다는 것을 읽었습니다. 메인 UI 스레드에서 메인 UI 스레드에서 다른 스레드가 실행될 때까지 기다리는 UI 스레드 - 작동하지 않음

  • 전화 thread2를

    1. 호출 thread1 :

      그러나, 내 응용 프로그램에 필요합니다.

    2 스레드의 출력 (2 개 이미지)을 사용하여 추가 한 다음 표시합니다.

    메인 스레드가 완료 될 때까지 메인 스레드가 thread1과 thread2를 기다릴 수 있도록 Thread.sleep()을 사용하고 있습니다. 그러나 mImageview.setbitmap은 주 스레드에서 (sleep 후) 호출 한 후에 작동하지 않습니다.

    내가 어떻게해야하는지 조언 해 줄 수 있습니까?

  • 답변

    1

    Android에서 멀티 스레딩을 비동기 적으로 수행해야합니다. 이를 위해 AsyncTask-class을 사용해야합니다.

    예를 들어, 두 이미지를로드 (또는 처리) 할 탭을 만들 수 있습니다. 프로세스가 실행 중일 때 (다른 스레드에서 UI 스레드 해제) ProgressBar을 표시하여 응용 프로그램이 현재 사용 중임을 사용자에게 보여줄 수 있습니다 (UI 스레드에서 수행됨).

    작업이 끝나면 작업에서 결과 (두 이미지)를 얻고 진행률 막대를 숨기고 모든 것을 사용자에게 보여줍니다.

    UI가없는 UI가 항상 응용 프로그램을 멈추게한다는 사실에도 불구하고 UI 스레드가 5 초 이상 (예 : looong 시간) 차단되면 응용 프로그램이 다음과 같이 강제 종료됩니다. 그것은 "반응"하지 않습니다 (그리고 ANR가 제기 될 것입니다).

    +0

    이벤트 처리기에서 대기 중일 때 '내 부동 소수점 비교 실패'및 '내 스레드를 어떻게 중지 할 수 있습니까?' : –

    +0

    또 다른 점은 GUI가 차단되면 '작업 취소'버튼이 없어 사용자가 실수로 시작한 것을 멈출 수 없을 때 매우 짜증나고 성가시다 '모래 시계 애플리케이션 ' –

    +0

    @MartinJames 당신은'AsyncTask'를 취소 할 수 있습니다. 이것은 버튼이나 "back"-key로 구현 될 수 있습니다. –

    0

    그냥 Thread.Sleep()이 아닙니다. GUI 스레드에서 두 스레드/작업/무엇이든지 시작한 다음 이벤트 처리기를 종료하는 데 필요한 작업을 수행하십시오.

    GUI 이벤트 처리기에서 기다리지 마십시오! 자바, C++, C, 델파이가 아닙니다. 비동기 작업 또는 처리기를 사용하고 GUI 스레드에 신호를 보내십시오. 스레드 1은 완료되었음을 알리고 스레드 2는 완료되었음을 알립니다. 두 경우 모두 다른 스레드가 데이터를 반환했는지 확인하십시오. 그럴 경우 반환 된 데이터 세트가 모두 있으므로 추가하여 표시 할 수 있습니다.

    GUI 이벤트 핸들러에서 대기하지 마십시오.

    0

    이 목적으로 스레드 및 처리기를 간단하게 사용할 수 있습니다. 여기 내가에 제안 작은 이것에 대한 데모,

    이 같은 스레드 호출 지금,이처럼에서 onCreate에

    Drawable d=null;  
    
    Handler handler=new Handler() 
    { 
    
    public void handleMesaage(Message msg) 
    { 
        if(msg.what==0) 
    { 
        imageView.setBackgroundDrawable(d); 
    } 
    
    } 
    
    }; 
    

    처리기를 만들고,

    Thread t=new Thread(new Runnable() 
    { 
    @Override 
    public void run() { 
        InputStream is = (InputStream) new URL(url).getContent(); 
        d = Drawable.createFromStream(is, "src name"); 
        handler.sendEmptyMessage(0); 
    } 
    });t.start(); 
    
    0

    입니다 ExecutorService을 사용하십시오. 방법은 다음과 같습니다

    1. 두 이미지로드 활동을 Runnable 작업으로 생성하십시오.
    2. ExecutorService를 사용하여 실행하십시오.
    3. ExecutorService.awaitTermination(); 메인 thread가 Runnable 태스크의 완료를 기다린다. 모든 작업이 종료 요청 후 실행을 완료 할 때까지 그 문서는

    블록을 읽거나 타임 아웃이 발생하거나, 현재의 thread는, 둘 중 먼저 발생 중단됩니다.

    이것은 비동기적인 방식으로 수행하는 것이 좋습니다.

    관련 문제