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