EDIT : SOLVED. 미안 해요, 내 데이터 로딩 중에 백그라운드 스레드에서 발생하는 동안 데이터를 구문 분석하는 콜백 아니었다 발생했습니다. 데이터 구문 분석은 매우 오랜 시간이 걸렸고, 그게 내 스레드를 잠그고 있었던 것이 었습니다.UI 스레드를 잠그는 doinbackground에서 ASynchTask 잠.
EDIT : 내 관심사는 ProgressDialog가 더 이상 회전하지 않는 문제가 UI 스레드가 차단되지 않고 ProgressDialog를 사용하여 발생했기 때문일 수 있습니다. 그렇다면 어떻게 수정해야합니까?
편집 : 명확히하기 위해 전체 프로그램을 영원히 잠글 수는 없습니다. 모든 것이로드되면 진행 대화 상자가 닫히고 새로운 활동이 시작됩니다. 내 문제는 전체 UI 자물쇠를로드하는 동안이다 (즉해서 ProgressDialog 중지 방사)
TL; DR은 : doInBackground에서 Thread.sleep를()는()는 UI 스레드 I는이
로킹된다 특정 활동이 열리면 일정과 관련된 많은 양의 데이터와 같이 백엔드에서 많은 양의 데이터를 백엔드에서로드하기 시작합니다. 이 정보는 곧바로 사용되지는 않지만 사용자가 액세스하려고하면 (예 : 일정 버튼을 클릭하고 일정 활동을 시작하면) 사용할 수 있습니다.
일정 버튼을 클릭하기 전에 잠깐 기다리면 모든 데이터가로드되고 일정 활동이 열리고 모든 것이 표시됩니다. 내 문제는 그들이 데이터가로드되기 전에 버튼을 클릭하는 것입니다.
여기 내 해결책은 데이터로드가 완료되었는지 정기적으로 확인하면서 ProgressDialog를 표시하는 ASyncTask를 작성하고 그렇지 않으면 잠자는 것입니다. 데이터가 일부 응용 프로그램 전반의 부울 변수를 통해로드가 완료되었음을 알 수 있습니다. 내 문제는 Thread.sleep() doinbackground() 내에서 실행되는 경우에도 그것은 여전히 UI 스레드 잠금 것입니다.
내가 아래에 정의 된 사용자 정의 AsyncTask를 사용하고 있습니다 :
public class LoadWithProgressDialog extends AsyncTask<Void, Void, Boolean>{
private ProgressDialog pd; //the progress dialog
private String title; //the title of the progress dialog
private String message; //the body of the progress dialog
private Runnable task; //contains the code we want to run in the background
private Runnable postTask; //execute when the task ends
private Context c;
public LoadWithProgressDialog(Context context,String t, String m,Runnable r, Runnable postR){
super();
c = context;
task = r;
postTask = postR;
title = t;
message = m;
}
@Override
protected void onPreExecute(){
pd = ProgressDialog.show(c,title, message, false, false);
}
@Override
protected Boolean doInBackground(Void... params) {
task.run();
return true;
}
@Override
protected void onPostExecute(Boolean result) {
pd.dismiss();
if(postTask != null)
postTask.run();
}
을하고 (예를 들어)를 통해 전화 :
if(loadingSchedule){
LoadWithProgressDialog lwpd = new LoadWithProgressDialog(thisClass,"Loading","Loading Schedule", new Runnable() {
public void run(){
while(loadingSchedule){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
},new Runnable() {
public void run(){
Intent i= new Intent(thisClass, Schedule.class);
i.putExtra("numberIneed",index);
startActivity(i);
}
});
lwpd.execute();
은 (I가 글로벌 변수를 "loadingSchedule"에 대한 액세스 권한을 단축 읽기 쉽게)
UI 스레드를 잠글 수 없도록 만드는 방법은 무엇입니까?
죄송합니다. 설명을 위해 제 편집문을 참조하십시오. 백그라운드로드가 완료되면 모든 것이 다시 작동합니다. 그것은 지속 시간 동안 잠겨 있습니다 (ProgressDialog 회전하지 않음). UI가 잠겨있는시기를 식별하는 방법을 모르겠다. 왜냐하면 진행중인 대화 상자 회전을 유지해야하는 것 이외의 다른 코드가 실행되지 않기 때문입니다. (쓰지는 않았습니다) –