Java 如何在“中设置延迟”;onItemSelected();android中的功能?

Java 如何在“中设置延迟”;onItemSelected();android中的功能?,java,android,android-activity,Java,Android,Android Activity,我在我的应用程序中使用的菜单与本文相同。。。我正在使用gallery视图显示我的菜单项 问题是,我为gallery实现了onItemSelectedlistener,以便在选择新项目时加载与该主题相关的数据但我还希望允许用户完全滚动库。但每次当用户移动到下一项时,onItemSelected()函数被调用并开始加载数据 我所要做的就是在onItemSelected()函数中添加一些延迟,这样,如果在延迟之间,用户滚动下一项,则无需加载上一项的数据,而只需加载当前项的数据。时间可能是1秒。如果用

我在我的应用程序中使用的菜单与本文相同。。。我正在使用gallery视图显示我的菜单项

问题是,我为gallery实现了
onItemSelected
listener,以便在选择新项目时加载与该主题相关的数据但我还希望允许用户完全滚动库。但每次当用户移动到下一项时,
onItemSelected()
函数被调用并开始加载数据

我所要做的就是在
onItemSelected()
函数中添加一些延迟,这样,如果在延迟之间,用户滚动下一项,则无需加载上一项的数据,而只需加载当前项的数据。时间可能是1秒。如果用户在1秒内没有进入下一个项目,则必须加载该项目的数据

有人能帮忙吗?我本想启动一个线程,但每次对于
onItemSelected()
都会有新的线程

我也试过这个

public class TimerThreadForCategoriesMenu extends Thread{

int old = -1;
int cur = -1;
CategoriesActivity catAct = null;

public TimerThreadForCategoriesMenu(CategoriesActivity act , int cu) {
    this.cur = cu;
    old = cu;
    this.catAct = act;

}
@Override
public void run() {
    Looper.prepare();

    do{
        old = this.cur;
        for(int i = 0; i<15; i++){
            try{
                Thread.sleep(100);

            }catch (Exception e) {
                e.printStackTrace();
            }
        }

    }while(cur != old);
    catAct.performTask();
    Looper.loop();  
}

public void setCur (int curr){
    this.cur = curr;
}

}
发现异常:

11-24 16:48:50.046:错误/AndroidRuntime(8049):未捕获处理程序:由于未捕获异常,线程8正在退出
11-24 16:48:50.126:ERROR/AndroidRuntime(8049):android.view.ViewRoot$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图。
11-24 16:48:50.126:ERROR/AndroidRuntime(8049):在android.view.ViewRoot.checkThread(ViewRoot.java:2683)上
11-24 16:48:50.126:ERROR/AndroidRuntime(8049):在android.view.ViewRoot.invalidateChild(ViewRoot.java:570)上
11-24 16:48:50.126:ERROR/AndroidRuntime(8049):在android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:596)上
11-24 16:48:50.126:ERROR/AndroidRuntime(8049):在android.view.ViewGroup.invalidateChild(ViewGroup.java:2396)上
11-24 16:48:50.126:ERROR/AndroidRuntime(8049):在android.view.view.invalidate(view.java:4945)上
11-24 16:48:50.126:错误/AndroidRuntime(8049):在


使用
处理程序
postDelayed()
a
Runnable

编辑:

这取决于您希望进行的处理。 请查看参考资料中的
活套
。UI有自己的
活套
,因此不需要创建活套。只需创建一个
处理程序
,但是发布到UI线程处理程序的任何
可运行的
都将在UI线程上运行。如果你正在做需要一段时间才能完成的事情,那么用
处理程序创建你自己的
线程
,并将
可运行文件发布到该线程。

编辑:

因此,在活动中创建成员

Handler handler;
MyLooper mylooper;
你的线活套

class MyLooper extends Thread {
  public Handler handler;

  public void run() {
      Looper.prepare();

      handler = new Handler() {
          public void handleMessage(Message msg) {}
      };

      Looper.loop();
  }
}
活动中。onCreate

handler = new Handler();
mylooper = new MyLooper();
现在创建
Runnable
s

Runnable processinfo = new Runnable() {
    public void run() {
        //  your processing here
    }
}

Runnable updateui = new Runnable() {
    public void run() {
        //  update ui component here
    }
}
现在让这些
可运行文件执行

mylooper.handler.postDelayed(processinfo, 1000);

handler.post(updateui);

您需要一些逻辑来处理根据延迟的需要取消运行的问题。

我有完全相同的要求,因为如果用户在库中旋转,我希望避免这些事件,那么会频繁调用onItemSelected。我使用处理程序实现了一个简单的延迟机制,如下所示:

在Activity类中定义一个处理程序实例,并重写应具有onItemSelected逻辑的handleMessage。在这里,我发现msg.obj包含了图库中selectedItem的文本

Handler handler = new Handler() {
    public void handleMessage(Message msg) {
                    // Add your OnItemSelected code here
        Log.d("Gallery", msg.obj + "");
        Toast.makeText(MainActivity.this, msg.obj + "", Toast.LENGTH_SHORT)
                .show();
    }
};
这只是一个任意常量,用于引用我从MSELECTED发送的消息

public static final int MSG_ITEM_SELECTION = 1;
在onItemSelected中,我首先删除任何以前的消息,以避免在用户旋转库时触发事件,然后添加一个带有所选项目文本的新消息对象,并以500毫秒的延迟发布它

public void onItemSelected(AdapterView<?> adapter, View view,
                int position, long id) {
            handler.removeMessages(MSG_ITEM_SELECTION);
            Message msg = handler.obtainMessage(MSG_ITEM_SELECTION);
            msg.obj = ((TextView) view).getText();
            handler.sendMessageDelayed(msg, 500);
        }
public void已选中(适配器视图适配器、视图、,
内部位置,长id){
handler.removeMessages(消息项选择);
Message msg=handler.obtainMessage(消息项选择);
msg.obj=((TextView)视图).getText();
handler.sendMessageDelayed(msg,500);
}

这段代码对我来说很好,只有在旋转停止后真正选择了某个库项目时,我才会收到“onItemSelected”。

@Arsian:希望这能有所帮助。如果不让我知道,你能告诉我你做了什么吗?还有什么是例外消息?是的,我在你的编辑下发表了评论。如果没有道理,请告诉我。请告诉我好吗?如何将ScrollView添加到gallery?不知道你的意思。你让线程处理程序工作了吗?好的,差不多了。您需要做的是在活动中创建一个处理程序,这样您就可以向UI线程发布一个Runnable来更新UI组件。另外,最好不要将线程循环与do..while(looper.prepare stuff就是这样做的)。在你的线程中创建另一个处理程序,并向它发布一个Runnable。我不明白。你能给我写些密码吗?好的。我将编辑我的原始答案。希望代码更有意义;D
public void onItemSelected(AdapterView<?> adapter, View view,
                int position, long id) {
            handler.removeMessages(MSG_ITEM_SELECTION);
            Message msg = handler.obtainMessage(MSG_ITEM_SELECTION);
            msg.obj = ((TextView) view).getText();
            handler.sendMessageDelayed(msg, 500);
        }