同期の使用方法を正しく理解しているかどうかを知りたいのですが、私がやろうとしていることを模倣する疑似コードを書き留めます。
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 に通知します。これにより、前回以降のすべての新しいデータが表示されます。AsyncTask は、新しいデータが到着するまでデータをロックします。DisplayActivity は、続行して表示するように通知されるまでロックで待機します。これは正しいですか?これは通常の方法ですか?