Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按顺序运行线程,以便它们不会';t冲突_Java_Android_Multithreading - Fatal编程技术网

Java 按顺序运行线程,以便它们不会';t冲突

Java 按顺序运行线程,以便它们不会';t冲突,java,android,multithreading,Java,Android,Multithreading,所以,一般的设置是我有一个ListView,它使用片段根据选项卡获取不同的值 如果我缓慢地移动标签,效果会很好。但如果我快速翻开标签,它们就会“冲突”。(一个选项卡中的项目将显示在第二个选项卡上) 因此,我的解决方案是让线程具有可运行部分,然后创建一个队列并添加到队列中,然后将它们从队列中运行。当我这么做的时候,我不认为这会起作用,但事实并非如此 因此,一般代码如下所示: final Thread clearThread = new Thread(new Runnable() { pub

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

如果我缓慢地移动标签,效果会很好。但如果我快速翻开标签,它们就会“冲突”。(一个选项卡中的项目将显示在第二个选项卡上)

因此,我的解决方案是让线程具有可运行部分,然后创建一个队列并添加到队列中,然后将它们从队列中运行。当我这么做的时候,我不认为这会起作用,但事实并非如此

因此,一般代码如下所示:

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类中,其中方法、适配器等都在fragment类(MyFrag)中

因此,一般的问题是,如何更改ListView,使其在填充时不会与填充的其他值冲突某些线程确实在线获取值,因此根据连接的不同,它们可以快也可以慢,但它会加载,以便在加载时添加

任何帮助都将不胜感激

谢谢

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

i、 e

在处理器中

if (currentId.get() == ourId) {
   // only here do stuff
}
synchronized(lock) {
    if (currentId == ourId) {
       // only here do stuff
    }
}
为了总体安全起见,您可以使用同步块而不是AtomicInteger,在这种情况下,您可能不需要它,但该版本如下所示:

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

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

if (currentId.get() == ourId) {
   // only here do stuff
}
synchronized(lock) {
    if (currentId == ourId) {
       // only here do stuff
    }
}
将“当前请求id”递增字段放入。生成线程时,在线程中设置请求id。当线程完成时,检查字段并仅在匹配时更新视图

i、 e

在处理器中

if (currentId.get() == ourId) {
   // only here do stuff
}
synchronized(lock) {
    if (currentId == ourId) {
       // only here do stuff
    }
}
为了总体安全起见,您可以使用同步块而不是AtomicInteger,在这种情况下,您可能不需要它,但该版本如下所示:

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

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

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

若要同步线程,请锁定对象,并且当两个线程必须始终彼此同步时,可能只有一个线程。为什么不为每个选项卡使用单独的ListView。

要同步线程,请锁定对象,并且当两个线程必须始终相互同步时,可能只有一个线程。为什么不为每个选项卡使用单独的列表视图。

这对我来说没有多大意义。要不要再扩大一点?可能会显示一些伪代码?他有一个
ListView
,但多个线程正在后台修改它,这听起来像是。是的,听起来像你说的。也许他可以重新设计它,让每个标签页都有一个列表视图,并有一个异步任务来加载项目。不过,我确实做了一些与你所说的非常相似的事情。给每个选项卡提供了自己的适配器(或者类似的东西,我真的不知道我做了什么,lol,但它可以工作)。我会认为你是正确的,因为上面所说的没有多大帮助。这对我来说没有多大意义。要不要再扩大一点?可能会显示一些伪代码?他有一个
ListView
,但多个线程正在后台修改它,这听起来像是。是的,听起来像你说的。也许他可以重新设计它,让每个标签页都有一个列表视图,并有一个异步任务来加载项目。不过,我确实做了一些与你所说的非常相似的事情。给每个选项卡提供了自己的适配器(或者类似的东西,我真的不知道我做了什么,lol,但它可以工作)。我认为你是对的,因为上面所说的没有多大帮助。