我想知道我是否正确理解如何使用同步我会写下一些伪代码,它会模仿我想要做的事情。
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等待锁定,直到通知继续并显示。 这是正确的吗?这是通常的方式吗?
答案 0 :(得分:0)
不,这样你可以阻止onCreate
中的UI线程,你将得到Application Not Responding错误。
相反,只要您有新数据,请在doInBackground()
中收集数据,然后在updateProgress()
中调用doInBackground()
。这将导致来自UI线程的AsyncTask.onProgress()
调用。在onProgress()
中,根据新数据执行您需要的任何操作。