如何在android中设置“onItemSelected()”函数的延迟?

时间:2010-11-24 05:48:14

标签: java android android-activity

我在我的应用程序中使用与此帖相同的菜单...我正在使用图库视图来显示我的菜单项。

Text Gallery on Android?

问题在于,我为gallery实现了onItemSelected侦听器,以便在选择新项目时加载与该主题相关的数据。 但我还想让用户完全滚动图库。但每当用户移动到下一个项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;
}

}

并在OnItemSelected()

      if(timer == null){  

        timer = new TimerThreadForCategoriesMenu(this, arg2);
        timer.start();
    }
    timer.setCur(curInd);

发现异常:

  

11-24 16:48:50.046:ERROR / AndroidRuntime(8049):未捕获的处理程序:由于未捕获的异常而退出的线程-8   11-24 16:48:50.126:ERROR / AndroidRuntime(8049):android.view.ViewRoot $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图。
  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:ERROR / AndroidRuntime(8049):at

2 个答案:

答案 0 :(得分:1)

使用HandlerpostDelayed() a Runnable

编辑:

这取决于您希望进行的处理。 在参考文献中查看Looper。用户界面有自己的Looper,因此您无需创建一个。只需创建一个Handler,但是发布到UI线程处理程序的任何Runnable都将在UI线程上运行。如果您正在完成需要一段时间才能完成的内容,请使用Thread创建您自己的Handler并发布Runnableshttp://developer.android.com/reference/android/os/Looper.html

编辑:

因此,在您的活动中创建成员。

Handler handler;
MyLooper mylooper;

你的线程looper。

class MyLooper extends Thread {
  public Handler handler;

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

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

      Looper.loop();
  }
}

Activity.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
    }
}

现在让这些Runnables执行。

mylooper.handler.postDelayed(processinfo, 1000);

handler.post(updateui);

根据延迟的需要,您需要一些逻辑来处理取消Runnable

答案 1 :(得分:1)

我有完全相同的要求,因为如果用户在画廊中旋转,我会经常调用onItemSelected,以避免这些事件。我使用Handler实现了一个简单的延迟机制,如下所示:

在Activity类中定义一个处理程序实例,并覆盖应该具有onItemSelected逻辑的 handleMessage 。在这里,我的msg.obj包含了Gallery

中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();
    }
};

这只是一个任意常量,用于引用我从OnItemSelected

发送的消息
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);
        }

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