我在我的应用程序中使用与此帖相同的菜单...我正在使用图库视图来显示我的菜单项。
问题在于,我为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
答案 0 :(得分:1)
使用Handler
和postDelayed()
a Runnable
编辑:
这取决于您希望进行的处理。
在参考文献中查看Looper
。用户界面有自己的Looper
,因此您无需创建一个。只需创建一个Handler
,但是发布到UI线程处理程序的任何Runnable
都将在UI线程上运行。如果您正在完成需要一段时间才能完成的内容,请使用Thread
创建您自己的Handler
并发布Runnables
。
http://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。