2012-05-01 3 views
0

정확하게 사용하는 방법을 알고 싶습니다. 동기화 됨의사 코드을 쓰겠습니다.이 코드는 제가하려고하는 것을 모방합니다. 나는 전역 목록의 데이터를 가하고, 백그라운드에서 데이터 수집 작업을 실행하고 있습니다 : 여기이 코드에서 동기화가 올바르게 사용되고 있습니까?

public MyApp extends Application { 

    public Object mLock = new Object(); 

    private final ArrayList<String> MyList = new ArrayList<String>(); 

    public ArrayList<String> getMyList(){ 
     return MyList; 
    } 
} 


private class MyTask extends AsyncTask<String, Void, Void> { 
    @Override 
    protected Void doInBackground(String... url) { 
     final ArrayList<String> BgList = MyApp.getMyList(); 
     synchronized (mLock) { 
      while(somefinishcondition) { 
       try { 
        // Get some stuff from the web 
        BgList.add(newstuff); 
        mLock.notifyAll(); 
       } 
       catch (IOException e) { 
       } 
      } 
     } 
     return null; 
    } 
} 


public class DisplayActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.viewer); 

     final ArrayList<String> FgList = MyApp.getMyList(); 

     synchronized (mLock) { 
      while(somecondition) { 
       mLock.wait(); 
       if(FgList.size()>lastSize) { 
        n = FgList.size(); 
        for(i=lastSize+1; i<=n ; i++){ 
         Display(Fglist.get(i)); 
        } 
        lastSize = n; 
       } 
      } 
     } 
} 

내가 뭐하는 거지을 생각 입니다. 새로운 데이터가 생길 때마다 DisplayActivity에 알립니다. DisplayActivity는 마지막으로 모든 데이터를 표시합니다. AsyncTask는 새 데이터가 도착할 때까지 데이터를 잠급니다. DisplayActivity는 진행하고 표시하도록 알릴 때까지 잠금을 기다립니다. 이게 맞습니까? 이것은 일반적인 방법입니까?

답변

0

아니요, 이렇게하면 onCreate에 UI 스레드를 차단할 수 있으며 응용 프로그램이 응답하지 않는 오류가 발생합니다.

새로운 데이터가있을 때마다 doInBackground()에 데이터를 수집 한 다음 updateProgress()doInBackground()으로 호출하십시오. UI 스레드에서 AsyncTask.onProgress() 호출이 발생합니다. onProgress()에 새 데이터가 필요한 모든 작업을 수행하십시오.

+0

그러나 AsyncTask.onProgress는 사용자와 상호 작용할 수 없으며 너무 복잡합니다. 실행화된 스레드에서 디스플레이 동기화 된 블록을 실행하여 활동을 차단하지 않으면 어떻게됩니까? – ilomambo

+0

AsyncTask.onProgress가 UI 스레드에서 실행됩니다. UI 스레드를 차단하지 않고 UI 스레드에서 onProgress 및 onPostExecute에서 결과 (예 : 결과 표시)를 처리하도록 doInBackground에서 백그라운드 작업을 수행하는 것이 좋습니다. –

+0

정보를 제공해 주셔서 감사합니다. 나는 원래의 질문에서 벗어나고 싶지 않을 것이다. ** 동기화 된 **은 의미대로 사용 되었는가? wait()가 앉아서 다른 스레드가 알릴 때까지 대기합니까? 아니면 그 기능에 다른 목적이 있습니까? – ilomambo

관련 문제