안녕하세요, 주위를 둘러 본 후 publishProgress()를 사용하면 더 긴 계산을 위해 UI를 업데이트 할 수 있습니다. 나는이 코드를 실행할 때 ANR을 얻었 기 때문에 이것을 잘못 구현 한 것처럼 보인다. 왜 그 이유를 이해하도록 도와 주실 수 있습니까? http://pastebin.com/zQNhkDJ9AsyncTask에서 UI 업데이트
답변
귀하에 문제가 doInBackground 기능은 단지 publishProgress를 호출하는 것이 아마도 :
여기 내 코드입니다. 모든 작업은 UI 스레드에서 실행되는 publishProgress에서 수행되므로 여전히 ANR 방식으로 진행됩니다. doInBackground 내에서 무거운 작업을 수행해야하며 처리가 완료되면 UI 스레드를 업데이트 할 수 있습니다.
AsyncTask를 정적 내부 클래스로 만들어야하고 Activity에 대한 참조 인 속성이 있어야합니다. 그런 다음 UIupdate()처럼 직접 Activity에서 메서드를 호출 할 수 있습니다.
onPause 콜백에서 Activity에 대한 참조를 지우려면 매우 조심해야한다는 점에 유의해야합니다. 그렇지 않으면 순환 참조가 설정되어 메모리 누수가 발생합니다.
내 패턴은 또 하나의 기본 Java 객체를 갖습니다.이 객체는 Activity에서 "StateHolder"라고 부르는 다른 개인 정적 클래스와 AsyncTask 객체를 처리하기위한 내 게이트웨이 (예 : 초기화 및 NULL (NULL로 설정))를 가지고 있습니다.) 및 회전 변경 중에 진행중인 작업 취소. "onRetainNonConfigurationInstance"에 대한 콜백에서 StateHolder를 마샬링 된 객체로 사용할 수 있습니다. 여기
약간 거친 코드 :개인 정적 클래스 GetConnectionsStatusTask은 AsyncTask를 { 개인 BoothActivity mActivity을 확장; 개인 예외 mReason;
public GetConnectionsStatusTask(BoothActivity activity) {
super();
mActivity = activity;
}
public void setActivity(BoothActivity activity) {
mActivity = activity;
}
@Override
protected void onPreExecute() {
if(mActivity != null) {
mActivity.startProgressBar("Loading", "Please wait");
}
}
@Override
protected Connections doInBackground(Void... values) {
try {
App app = (App)mActivity.getApplication();
return(app.getApp().userConnections());
}catch(Exception e) {
mReason = e;
return(null);
}
}
@Override
protected void onPostExecute(Connections status) {
super.onPostExecute(status);
if(mActivity != null) {
mActivity.completedConnectionsStatusCheck(status, mReason);
}
}
}
개인 정적 클래스 StateHolder { 개인 GetConnectionsStatusTask connectionsTask; 당신이 그렇게처럼 StateHolder를 다시 팽창 할 수
if(mStateHolder != null) {
mStateHolder.cancelTasks();
}
그리고에서 onCreate에서 :
Object retained = getLastNonConfigurationInstance();
if(retained != null && retained instanceof StateHolder) {
mStateHolder = (StateHolder) retained;
mStateHolder.setActivityForTasks(this);
} else {
mStateHolder = new StateHolder();
}
이 또한 StateHolder를 다시 초기화합니다 onPause에서 다음
public void cancelTasks() {
if (connectionsTask != null) {
connectionsTask.setActivity(null);
connectionsTask.cancel(true);
connectionsTask = null;
}
}
public void setActivityForTasks(BoothActivity activity) {
if (connectionsTask != null) {
connectionsTask.setActivity(activity);
}
}
public void startConnections(BoothActivity activity) {
if(mIsConnectionsChecking == false) {
mIsConnectionsChecking = true;
connectionsTask = new GetConnectionsStatusTask(activity);
connectionsTask.execute();
}
}
}
나는 같은 코드가 현재 진행 상태와 함께 진행 막대 업데이트와 같은 UI 위젯을 다시 설정할 수 있습니다.
이 패턴을 사용하면 실제로 비동기 작업을 실행하고 진행 막대가 다시 초기화되어 회전 변경을 처리 할 수 있습니다.
- 1. ASyncTask에서 활동을 닫는 방법?
- 2. Asynctask에서 값을 반환
- 3. 업데이트 UI 서비스에서
- 4. INotifyPropertyChanged, UI 업데이트 없음
- 5. 스레드의 UI 활동 업데이트
- 6. 외부 이벤트에서 UI 업데이트
- 7. AsyncCallback에서 UI 업데이트
- 8. WP7 UI 업데이트 문제
- 9. Android에서 UI 업데이트
- 10. 스레드에서 UI 업데이트
- 11. 다른 스레드에서 UI 업데이트
- 12. NSTimer 및 UI 업데이트
- 13. WPF의 코드로 UI 업데이트
- 14. WPF - 동기 UI 업데이트
- 15. AsyncTask에서 사용자 정의 Dialog 호출하기
- 16. 백그라운드 스레드 문제에서 UI 업데이트
- 17. Silverlight, 처리 중 UI 업데이트
- 18. jQuery-UI 대화 상자 업데이트
- 19. WPF 특정 지연으로 UI 업데이트
- 20. wpf BackgroundWorker - UI 업데이트 관련
- 21. 백그라운드 스레드에서 UI 컨트롤 업데이트
- 22. 다른 스레드에서 UI 업데이트 (progressDialog)
- 23. 컨트롤러 생성자로 UI 요소 업데이트
- 24. stringWithContentsofurl을 사용할 때 UI 업데이트
- 25. audiotrack을 사용하여 스레드에서 ui 업데이트
- 26. 다른 Runnable의 핸들러에서 UI 업데이트
- 27. 안드로이드에서 ASyncTask에서 메뉴 항목을 해제하는 방법?
- 28. 어떻게 AsyncTask에서 ProgressDialog를 닫을 수 있습니까?
- 29. AsyncTask에서 Main Activity로 반환 값을 얻으려면 어떻게해야합니까?
- 30. AsyncTask에서 처리기를 호출 할 수 없습니까?
코드에서 AsyncTask를 만들고 실행하는 곳을 어디에도 알 수 없습니다. 다른 파일에서 그런 일이 발생 했습니까? – BigFwoosh
네, 게시 할 필요가 없다고 생각했습니다. – Cody