为什么在 Android 中单击按钮会重置变量?
Why variable gets reset on button click(s) in Android?
有人可以帮助我了解这里发生的事情吗?一直在尝试调试,但感觉卡住了!
我正在尝试使用以下方法在我的 Android 应用中制作一些在线图片。
private void animateImages() {
// URL loading
// int i = 1; (initialized earlier)
// ArrayList<String> myImages = new ArrayList<>(); (initialized earlier)
myImages.clear();
While (i < 11) {
// Adds ten images using web link
myImages.add("My_web_url");
i++;
}
AccelerateInterpolator adi = new AccelerateInterpolator();
try {
Field mScroller = ViewPager.class.getDeclaredField("mScroller");
mScroller.setAccessible(true);
mScroller.set(viewPager, new MyScroller(getApplicationContext(), adi, 1));
}
catch (NoSuchFieldException e) {
e.printStackTrace();
}
catch (IllegalAccessException e) {
e.printStackTrace();
}
if (viewPager != null) {
viewPager.setAdapter(new MyPageAdapter(getApplicationContext(), myImages));
}
final Handler handler = new Handler();
final Runnable Update = new Runnable() {
// Printing variables for debugging
System.out.println("The page number is=" + currentPage);
System.out.println("The myImages size is=" + myImages.size());
public void run() {
if (currentPage == myImages.size() - 1) {
currentPage = 0;
}
viewPager.setCurrentItem(currentPage++, true);
}
};
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
handler.post(Update);
}
// delay and period can be initialized as desired
}, delay, period);
}
}
当我在 OnCreate
中调用此方法时,动画效果很好。但是,当我在 OnClickButton Listener
中调用此方法时,变量 myImages
大小(在 public void run()
之前)变为零并且由于此动画不起作用。
上面的MySCroller
和MyPageAdapete
r是java类。但是,问题很可能与按钮点击有关,我不明白为什么它会重置停止动画的 myImages 大小!
这就是按钮点击侦听器的调用方式。我做错了什么?
MyButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
animateImages();
}
});
编辑 1:
感谢大家的评论,让我有了一点进步。
我将所有这些变量从 MainActivity 移动到 animateImages() 方法。动画也通过单击按钮运行,但动画中有一个颠簸,图像移动太快然后颠簸等等..
// Added just before while loop
DELAY_MS = 1000;
PERIOD_MS = 1000;
i = 1;
currentPage = 0;
如果我将 URL 加载 while 循环移动到 OnCreate()
,我会注意到相同的动画颠簸。
第二次调用 animateImages
时,它会清除 myImages
但随后不会循环,因为 i
未重置,因此它仍然为空。将该列表的创建移至 onCreate
以避免该问题。
有人可以帮助我了解这里发生的事情吗?一直在尝试调试,但感觉卡住了!
我正在尝试使用以下方法在我的 Android 应用中制作一些在线图片。
private void animateImages() {
// URL loading
// int i = 1; (initialized earlier)
// ArrayList<String> myImages = new ArrayList<>(); (initialized earlier)
myImages.clear();
While (i < 11) {
// Adds ten images using web link
myImages.add("My_web_url");
i++;
}
AccelerateInterpolator adi = new AccelerateInterpolator();
try {
Field mScroller = ViewPager.class.getDeclaredField("mScroller");
mScroller.setAccessible(true);
mScroller.set(viewPager, new MyScroller(getApplicationContext(), adi, 1));
}
catch (NoSuchFieldException e) {
e.printStackTrace();
}
catch (IllegalAccessException e) {
e.printStackTrace();
}
if (viewPager != null) {
viewPager.setAdapter(new MyPageAdapter(getApplicationContext(), myImages));
}
final Handler handler = new Handler();
final Runnable Update = new Runnable() {
// Printing variables for debugging
System.out.println("The page number is=" + currentPage);
System.out.println("The myImages size is=" + myImages.size());
public void run() {
if (currentPage == myImages.size() - 1) {
currentPage = 0;
}
viewPager.setCurrentItem(currentPage++, true);
}
};
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
handler.post(Update);
}
// delay and period can be initialized as desired
}, delay, period);
}
}
当我在 OnCreate
中调用此方法时,动画效果很好。但是,当我在 OnClickButton Listener
中调用此方法时,变量 myImages
大小(在 public void run()
之前)变为零并且由于此动画不起作用。
上面的MySCroller
和MyPageAdapete
r是java类。但是,问题很可能与按钮点击有关,我不明白为什么它会重置停止动画的 myImages 大小!
这就是按钮点击侦听器的调用方式。我做错了什么?
MyButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
animateImages();
}
});
编辑 1:
感谢大家的评论,让我有了一点进步。
我将所有这些变量从 MainActivity 移动到 animateImages() 方法。动画也通过单击按钮运行,但动画中有一个颠簸,图像移动太快然后颠簸等等..
// Added just before while loop
DELAY_MS = 1000;
PERIOD_MS = 1000;
i = 1;
currentPage = 0;
如果我将 URL 加载 while 循环移动到 OnCreate()
,我会注意到相同的动画颠簸。
第二次调用 animateImages
时,它会清除 myImages
但随后不会循环,因为 i
未重置,因此它仍然为空。将该列表的创建移至 onCreate
以避免该问题。