我認爲這不是一個簡單的問題。 我會簡要介紹一下正在發生的事情。 比方說,我們有數據的源文件Byron.txt:Android AsyncTask奇怪地發佈重複
她走在美,像黑夜
皎潔無雲而且繁星滿天;
和所有的「她的樣子和她的眼睛最好的黑暗和明亮
相約:
因此越加醇美那溫柔的光
就是天堂會餐日對此予以否認。
而這種代碼執行的AsyncTask裏面:
final ArrayList<Record> poem = new ArrayList<Record>();
final Object objectLock = new Object();
private Record rec = new Record();
@Override
protected Void doInBackground(Void... args) {
String line = null;
int i;
int last;
try {
process = Runtime.getRuntime().exec("cat Byron.txt");
bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()), 8192);
synchronized (objectLock) {
poem.clear();
last = i = poem.size() - 1;
}
while(line = bufferedReader.readLine()) != null) {
rec.setString(line);
synchronized (objectLock) {
last++;
poem.add(last, rec);
}
while(!bPause && i < last) {
i++;
publishProgress(poem.get(i));
}
}
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected synchronized void onProgressUpdate(Record... m) {
if(m.length > 0) {
mContext.mTable.appendRow(m[0]);
}
}
那裏是在UI每次TableLayout,我們得到一個新的生產線,我們添加一個新的TableRow它。 這是我們在UI看到輸出:
她走在美,像黑夜
皎潔無雲而且繁星滿天;
無雲的天空和滿天星斗的天空;
無雲的天空和滿天星斗的天空;
因此越加醇美那溫柔的光
因此越加醇美那溫柔的光
我們進入調試器,我們可以看到爲什麼它會發生。
有時跳過synchronized (objectLock)
並繼續循環。
沒有發佈,因爲i
已經捕獲last
。
後來塊被執行多次,因爲它是跳過,
,但原來的線丟失,當前行,而不是添加到poem
幾次
然後,所有新線發佈,直到i
漁獲last
再次。
所以你看我跟着代碼,我可以解釋發生了什麼,這裏的問題是:爲什麼塊被跳過?,爲什麼?
我期待同步塊停頓,直到它可以執行。
至少,這怎麼理解synchronized (objectLock)
功能即使不使用wait()
和notify()
我不假裝在這裏開設的討論(雖然如果你想要,我們可以打開一個聊天區)
如果您在代碼中看到錯誤,請回答問題以讓我知道。
注:
- 需要,因爲其他地方的應用程序,用戶可能希望通過電子郵件他得到了迄今爲止線。
- 用戶可以暫停出版(
bpause
);這就是while
環和i
如下last
只有當bPause
是假的。
感謝您將答案。如果他們自己找到答案,大多數人並不在乎添加答案。沒有什麼好尷尬的,這種事情偶爾會發生在所有程序員身上。 – Ronnie