我需要像书一样编写一个Android应用程序。我有大约100张图像,我需要用后退,前进和其他按钮显示它们。 我尝试为每个图像创建一个xml-layout,并将图像设置为布局的背景。
在运行应用程序时,如果我快速按下按钮,程序在切换xml-layout期间崩溃。如果我减少图像大小,我的问题也会减少。不幸的是,我需要另一种解决方案来解决它,因为我不能使用较小的图像尺寸,但我仍然有崩溃问题。
答案 0 :(得分:1)
有一个布局,其中包含ImageView。然后,只要您需要循环到下一张或上一张图像,就可以不断更改图像视图的源图像。
答案 1 :(得分:0)
部分问题是单击UI按钮会立即返回/队列点击,即使与该点击相关联的操作尚未完成。出于超出此响应范围的原因,值得注意的是,只需在执行工作时停用按钮即可。是无效的。这种问题有几种解决方案:一种是使用布尔标志,只有在基础" work"之后才能设置它。已经完成了。然后在按钮操作处理程序中,忽略在重置标志之前发生的按钮单击:
/**
* Button presses are ignored unless idle.
*/
private void onMyButtonClicked() {
if(idle) {
doWork();
}
}
/**
* Does some work and then restores idle state when finished.
*/
private void doWork() {
idle = false;
// maybe you spin off a worker thread or something else.
// the important thing is that either in that thread's run() or maybe just in the body of
// this doWork() method, you:
idle = true;
}
另一个通用选项是使用时间过滤;即。你设置一个限制,其中按下按钮的最大频率是1hz:
/**
* Determines whether or not a button press should be acted upon. Note that this method
* can be used within any interactive widget's onAction method, not just buttons. This kind of
* filtering is necessary due to the way that Android caches button clicks before processing them.
* See http://code.google.com/p/android/issues/detail?id=20073
* @param timestamp timestamp of the button press in question
* @return True if the timing of this button press falls within the specified threshold
*/
public static synchronized boolean validateButtonPress(long timestamp) {
long delta = timestamp - lastButtonPress;
lastButtonPress = timestamp;
return delta > BUTTON_PRESS_THRESHOLD_MS;
}
然后你做这样的事情:
private void onMyButtonClicked() {
if(validateButtonPress(System.currentTimeMillis())) {
doWork();
}
}
这最后一个解决方案无疑是不确定的,但如果您认为用户几乎从未在移动设备上有意点击按钮超过1-2次,那就不那么糟糕了。