정확하게 사용하는 방법을 알고 싶습니다. 동기화 됨의사 코드을 쓰겠습니다.이 코드는 제가하려고하는 것을 모방합니다. 나는 전역 목록의 데이터를 가하고, 백그라운드에서 데이터 수집 작업을 실행하고 있습니다 : 여기이 코드에서 동기화가 올바르게 사용되고 있습니까?
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는 진행하고 표시하도록 알릴 때까지 잠금을 기다립니다. 이게 맞습니까? 이것은 일반적인 방법입니까?
그러나 AsyncTask.onProgress는 사용자와 상호 작용할 수 없으며 너무 복잡합니다. 실행화된 스레드에서 디스플레이 동기화 된 블록을 실행하여 활동을 차단하지 않으면 어떻게됩니까? – ilomambo
AsyncTask.onProgress가 UI 스레드에서 실행됩니다. UI 스레드를 차단하지 않고 UI 스레드에서 onProgress 및 onPostExecute에서 결과 (예 : 결과 표시)를 처리하도록 doInBackground에서 백그라운드 작업을 수행하는 것이 좋습니다. –
정보를 제공해 주셔서 감사합니다. 나는 원래의 질문에서 벗어나고 싶지 않을 것이다. ** 동기화 된 **은 의미대로 사용 되었는가? wait()가 앉아서 다른 스레드가 알릴 때까지 대기합니까? 아니면 그 기능에 다른 목적이 있습니까? – ilomambo