按顺序运行线程,以便它们不会发生冲突

时间:2013-12-10 15:31:37

标签: java android multithreading

所以,一般设置是我有一个ListView,根据选项卡使用片段获取不同的值。

如果我慢慢地浏览标签,它会很有效。但如果我快速浏览标签,它们会“冲突”。 (一个标签中的项目将出现在第二个标签上)。

所以,我的解决方案是让Threads具有可运行的部分,然后有一个队列并添加到队列中,然后将它们从队列中运行。我不认为这样做会有效,但事实并非如此。

因此,通用代码如下所示:

final Thread clearThread = new Thread(new Runnable() {
    public void run() {
        MyFragment.adapter.clear();

    }
});
this.threadQueue.add(clearThread);
if (tab == MenuActivity.TITLES.indexOf("My"))
{
    // My Puzzles
    final Activity a = this;
    final Thread myThread = new Thread(new Runnable() {

        public void run() {
            MyFragment.getUserPuzzles(a);
        }
    });
    this.threadQueue.add(myThread);
}
else if (tab == MenuActivity.TITLES.indexOf("Top"))
{
    // Top Puzzles
    final Activity a = this;
    final Thread topThread = new Thread(new Runnable() {

        public void run() {
            MyFragment.getTopPuzzles(a);
        }
    });
    this.threadQueue.add(topThread);
}
//.... More adding the Thread Queue.

while (this.threadQueue.size() != 0)
{
    final Thread temp = this.threadQueue.poll();
    this.runOnUiThread(temp);
}

这是在我的FragmentActivity类中,因为方法,适配器等都在片段类(MyFrag)中。

因此,一般问题变成了,我如何改变ListView,使其不会与填充时填充的其他值发生冲突。 某些线程确实在线获取值,因此根据连接,它们可以快速或慢速,但它会加载以便在加载时添加。

任何帮助都将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:3)

将“当前请求ID”递增字段放入。当您生成线程时,在线程中设置请求ID。当线程完成时,检查该字段并仅在视图匹配时更新视图。

AtomicInteger currentId = new AtomicInteger(0);

new Processor(currentId.incrementAndGet()).start();

在处理器

if (currentId.get() == ourId) {
   // only here do stuff
}

为了完全安全,您可以使用synchronized块而不是AtomicInteger,在这种情况下您可能不需要它,但该版本看起来像:

int currentId = 0;
Object lock = new Object();

synchronized(lock) {
    new Processor(++currentId).start();  // Must add then use, not use then add!
}

在处理器

synchronized(lock) {
    if (currentId == ourId) {
       // only here do stuff
    }
}

答案 1 :(得分:2)

要同步线程,您需要锁定对象,当两个线程必须始终彼此同步时,它应该只是一个线程。为什么不为每个选项卡使用单独的ListView。