2012-07-09 5 views
1

다음과 같은 현상이 있습니다. 다른 클래스에서 이미지보기를 변경하려면 runOnUiThread() 메서드를 사용하고 있습니다. mainclass.runOnUiThread (새로운 Runnable ...)를 사용하여 호출하고 있습니다. 응용 프로그램이 처음 실행될 때 작동하지만 뒤로 단추를 눌러 응용 프로그램을 종료 한 다음 응용 프로그램을 다시 시작하면 이미지보기가 더 이상 업데이트되지 않습니다. 내가 찍은 로그는 모든 것이 잘되고 실행 중이라는 것을 보여 주지만 이미지보기는 바뀌지 않습니다. 오류가 발생하지 않고 응용 프로그램을 실행할 때 충돌이 발생하지 않고 이미지보기가 업데이트되지 않습니다. 무슨 일이 일어날 지 모르는 어떤 생각?runOnUiThread가 응용 프로그램이 파괴되었을 때 작동을 멈 춥니 다.

편집 * : 그래서 내가 실제로 활동을 peerActivity 다른 클래스 참조를 보유하고 ivPHoto은 이미지보기입니다

peerActivity.runOnUiThread(

           new Runnable(){ 

            @Override 
            public void run() { 
             Log.v("[email protected]", "Thread is running"); 
             Log.v("[email protected]", decodedImage.toString()); 
             // TODO Auto-generated method stub 
             peerActivity.ivPhoto.setImageBitmap(decodedImage); 
             Log.v("[email protected]", "Past UI Change"); 

            } 

           }); 

를 확장하지 않는 클래스의 이미지 뷰를 변경하려면 사용하고 있습니다 것입니다. 내가해야 할 일은 프로그램이 닫힐 때 그 스레드를 죽이는 방법을 찾는다는 것입니다 (프로그램 관리자에 들어가면 Force Close 버튼을 사용할 수 있습니다). 이 일을 할 수있는 방법이 있습니까?

Edit2 * : UI 스레드에서 작업하는 데 여러 가지 다른 방법을 시도했는데 모두 동일한 결과를주었습니다.이 프로그램은 처음 실행될 때 완벽하게 작동하지만 뒤로 버튼을 누르고 닫으면 다시 열면 이미지보기가 더 이상 업데이트되지 않습니다. 강제로 앱을 강제 종료하면 앱을 닫고 다시 열 때까지 다시 작동합니다.

+0

별도의 스레드에서 이미지를 디코딩한다고 생각합니다. AsyncTask를 사용하고 있습니까? 그렇지 않다면, 확실히 그쪽으로 움직여야합니다. http://developer.android.com/reference/android/os/AsyncTask.html 디코딩 된 이미지를 onPostExecute() 메소드로 리턴하고 거기에 설정하면 문제가 해결됩니다. onPostExecute() 및 onPreExecute() 및 onProgressUpdate() 모두 UI 스레드에서 실행되므로 항상 작동해야합니다. –

답변

2

대신 View.post(...)을 사용해보세요.

+0

그냥 시도했지만 작동하지 않았습니다. 또한 핸들러로 시도하고 같은 결과를 얻었습니다. – user1513272

0

새로운 Handler (Looper.getMainLooper())를 사용합니다. post (...);

배경 스레드로도 만들 수 있습니다.

0

귀하의 Runnable이 귀하의 활동에 대한 참조를 마감하고있는 것 같습니다. 뒤로를 누른 다음 활동을 다시 시작하면 이전 활동이 삭제되고 새 인스턴스가 작성됩니다. 백그라운드 스레드는 더 이상 존재하지 않는 원래 활동을 계속 변경하므로 뷰를 변경해도 아무 효과가 없습니다.

활동이 일시 중지되거나 적절하게 중지되면 업데이트 스레드를 중지하고 activty가 다시 시작되거나 다시 시작될 때 다시 시작해야하며 (실제로 적절한 경우) 항상 실제 활동중인 활동을 업데이트해야합니다 명백한.

관련 문제