Android AsyncTask奇怪地发布重复项

Android AsyncTask奇怪地发布重复项,第1张

概述我认为这不是一个容易的问题.我将简要介绍一下正在发生的事.假设我们在文件Byron.txt中有一个数据源:SHEwalksinbeauty,likethenightOfcloudlessclimesandstarryskies;Andallthat‘sbestofdarkandbrightMeetinheraspectandhereyes:Thusme

我认为这不是一个容易的问题.
我将简要介绍一下正在发生的事.
假设我们在文件Byron.txt中有一个数据源:

SHE walks in beauty, like the night
Of cloudless climes and starry skIEs;
And all that ‘s best of dark and bright
Meet in her aspect and her eyes:
Thus mellow’d to that tender light
Which heaven to gaudy day denIEs.

这段代码在AsyncTask中执行:

final ArrayList<Record> poem = new ArrayList<Record>();final Object objectLock = new Object();private Record rec = new Record();@OverrIDeprotected 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;}@OverrIDeprotected synchronized voID onProgressUpdate(Record... m) {    if(m.length > 0) {        mContext.mtable.appendRow(m[0]);    }}

UI中有一个tableLayout,每次我们得到新行时,都会向其中添加一个新的tableRow.
这是我们在用户界面中看到的输出:

SHE walks in beauty, like the night
Of cloudless climes and starry skIEs;
Of cloudless climes and starry skIEs;
Of cloudless climes and starry skIEs;
Thus mellow’d to that tender light
Thus mellow’d to that tender light

然后我们进入调试器,看看它为什么会发生.
有时,已同步的(objectLock)被跳过,循环继续进行.
没有发布,因为我已经赶上了最后.
之后,该块执行的次数与被跳过的次数相同,
,但是原始行丢失了,而是添加了当前行来多次写诗
然后,所有新行都会发布,直到我再次抓住最后一个.

因此,您看到我遵循了代码,并且可以解释发生了什么,这里的问题是:为什么跳过该块?为什么?
我希望同步块在执行之前会停滞.
至少这就是我对同步(objectLock)功能的理解
即使不使用wait()和notify()

我不假装在此处打开讨论(尽管如果您愿意,我们可以在聊天区域中打开一个讨论)
如果您在代码中发现错误,请回答问题以告知我.

笔记:

>需要同步,因为在应用程序中的其他位置,用户可能希望通过电子邮件发送到目前为止获得的信息.
>用户可以暂停发布(暂停);那是while循环,只有bPause为false时,我才最后跟随.

解决方法:

我决定发布答案.即使我为它的简单而感到尴尬.
只有在深入研究AsyncTask类和消息处理等之后,我才发现它.

I publish it in hope it will help people to check the basic things before jumPing to
conclusions, and that someone out there will save himself half a day deBUGging because of
this post.

记录记录每次都相同.诗ArrayList的每个条目都具有相同的元素ID.由于所有内容都是相同的,因此内容一次全部更改了.
进度立即发布时,它会打印正确的字符串,即最后一个字符串.但是如果有些延迟导致进度稍后发布,则检索poem.get(i)记录将检索到另一个条目,但具有相同的指针,因此具有相同的内容.

解决的办法是创建一个新的记录每个循环.

总结

以上是内存溢出为你收集整理的Android AsyncTask奇怪地发布重复项全部内容,希望文章能够帮你解决Android AsyncTask奇怪地发布重复项所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1073948.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存