2012-02-14 2 views
0

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 스레드를 잠글 수 없도록 만드는 방법은 무엇입니까?

답변

0

코드가 올바르게 보이며 주 스레드를 차단해서는 안됩니다.

디버거를 사용하십시오! lwpd.execute 다음에 doInBackground, Thread.sleep, onPostExecute에 중단 점을 넣으면 코드를 가져 오는 위치와 시간을 알 수 있습니다.

"정확히 UI 스레드가 차단 된 위치"에 대한 답변을 찾으십시오. 그 이름이 언급 한 바와 같이 doInBackground에서

+0

죄송합니다. 설명을 위해 제 편집문을 참조하십시오. 백그라운드로드가 완료되면 모든 것이 다시 작동합니다. 그것은 지속 시간 동안 잠겨 있습니다 (ProgressDialog 회전하지 않음). UI가 잠겨있는시기를 식별하는 방법을 모르겠다. 왜냐하면 진행중인 대화 상자 회전을 유지해야하는 것 이외의 다른 코드가 실행되지 않기 때문입니다. (쓰지는 않았습니다) –

5

에 Thread.sleep()가(), UI 스레드를 고정하지 않습니다 UI 스레드 doInBackground에서

에 Thread.sleep()() 잠금되어, 작업은 백그라운드에서 수행 비동기식으로

UI 스레드가 잠기지 않습니다.사실 AsyncTask가 시작되기 전에 (onPreExecute() 메소드에서) ProgressDialog 팝업이 나타나고 계속해서 AsyncTask를 실행하는 동안 (doInBackground() 메소드에서) 기본 액티비티와 사용자 상호 작용을 차단합니다. AsyncTask가 끝나면 마침내 무시됩니다. (onPostExecute() 메서드) 나는 특정 활동이 열릴 때, 내 백엔드

에서 백그라운드에서 많은 양의 데이터를로드하기 시작, 응용 프로그램이

이것은 일반적이다 데이터가로드를 완료했는지 정기적으로 확인하면서 ProgressDialog를 표시하는 ASyncTask를 만드는 대신 백그라운드에서 데이터를로드하는 AsyncTask 구현을 만드는 것이 더 효율적입니다.

API here을 확인하십시오. 올바르게 사용하는 좋은 예가 들어 있습니다.

+0

1) ProgressDialog 기본 활동과의 사용자 상호 작용을 팝업하고 차단합니다. 내 문제는 PD가 회전하지 않는다는 것입니다. 나는 이것이 UI 스레드가 차단된다는 것을 의미 할 수도 있고 그렇지 않을 수도 있음을 깨달았다. 2) 백그라운드에서 데이터를로드하고 있습니다. 이 progressdialog는 데이터가 준비되기 전에 데이터에 액세스하려고 시도하기 때문에 사용자가로드가 완료 될 때까지 기다려야합니다. –

+0

스핀 문제의 경우 [this] (http://stackoverflow.com/questions/3119676/android-progress-dialog-spinner-not-spinning)가 도움이되는지 확인하십시오. – yorkw

+0

@yorkw 대화 상자에서 UI를 차단하는 문제가 있습니다. 어떻게 처리해야합니까? !! 아시다시피 처음에는 주 스레드에서 실행해야합니다. –