【问题标题】:How to set delay in "onItemSelected()" function in android?如何在android中的“onItemSelected()”函数中设置延迟?
【发布时间】:2010-11-24 05:48:13
【问题描述】:

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

Text Gallery on Android?

问题是,我为画廊实现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:错误/AndroidRuntime(8049):未捕获的处理程序:线程 Thread-8 由于未捕获的异常而退出
11-24 16:48:50.126: ERROR/AndroidRuntime(8049): android.view.ViewRoot$CalledFromWrongThreadException: 只有创建视图层次结构的原始线程才能触摸其视图。
11-24 16:48:50.126:错误/AndroidRuntime(8049):在 android.view.ViewRoot.checkThread(ViewRoot.java:2683)
11-24 16:48:50.126: 错误/AndroidRuntime(8049): 在 android.view.ViewRoot.invalidateChild(ViewRoot.java:570)
11-24 16:48:50.126: 错误/AndroidRuntime(8049): 在 android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:596)
11-24 16:48:50.126: 错误/AndroidRuntime(8049): 在 android.view.ViewGroup.invalidateChild(ViewGroup.java:2396)
11-24 16:48:50.126: 错误/AndroidRuntime(8049): 在 android.view.View.invalidate(View.java:4945)
11-24 16:48:50.126: 错误/AndroidRuntime(8049):   在

【问题讨论】:

  • 好的,差不多了。您需要做的是在 Activity 中创建一个 Handler,以便您可以将 Runnable 发布到 UI 线程以更新 UI 组件。
  • 最好不要让线程循环与 do..while (这就是 looper.prepare 的东西所做的)。在您的线程中创建另一个处理程序并向其发布 Runnable。
  • 我听不懂。你能放一些代码吗?
  • 好的。我会编辑我原来的答案。
  • 希望代码更有意义。 ;D

标签: java android android-activity


【解决方案1】:

使用 HandlerpostDelayed() Runnable

编辑:

这取决于您希望进行的处理。 查看参考资料中的Looper。 UI 有自己的Looper,因此您无需创建一个。只需创建一个Handler,但是任何发布到 UI 线程处理程序的Runnable 都将在 UI 线程上运行。如果您正在做一些需要一段时间才能完成的事情,请使用Handler 创建您自己的Thread 并将Runnables 发布到该位置。 http://developer.android.com/reference/android/os/Looper.html

编辑:

所以在你的 Activity 中创建成员。

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

在你的Activity.onCreate

handler = new Handler();
mylooper = new MyLooper();

现在创建Runnables。

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

【讨论】:

  • @Arsian:希望对您有所帮助。如果不告诉我。
  • 你能告诉我你做了什么吗?还有什么异常信息?
  • 是的,我在您的编辑下发表了评论。让我知道它是否没有意义。
  • 请问可以吗?如何将 ScrollView 添加到图库?
  • 不确定你的意思。你让线程处理程序工作了吗?
【解决方案2】:

我有完全相同的要求,因为如果用户在画廊中旋转,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);
        }

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

【讨论】:

    猜你喜欢
    • 2011-05-11
    • 2013-03-30
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多