gpt4 book ai didi

android - 移动到 tabview 中的另一个选项卡时停止 handler.postDelayed

转载 作者:太空狗 更新时间:2023-10-29 14:27:51 27 4
gpt4 key购买 nike

在我的应用程序中,我使用的是 tabview。在其中一个选项卡中,我实现了一个刷新功能,例如:

private final Runnable r = new Runnable() {
public void run() {
mVar = true;
while (mVar == true){
calculateResult();
//refresh();

try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

handler.removeCallbacks(r);
setContentView(R.layout.result_view);
refresh();
setBackGround();
}
public void refresh() {
new Thread(r).start();
//handler.postDelayed(r, 1000);
}

我已经尝试使用 handler.removeCallbacks(r); 来阻止处理程序重复它自己或者我相信的那样。但是当我启动它时系统就崩溃了。

here is my error log:

04-23 01:14:20.234: D/dalvikvm(14753): GC_EXTERNAL_ALLOC freed 53K, 47% free 2868K/5379K, external 0K/0K, paused 37ms
04-23 01:14:20.265: D/ATRecorder(14753): com.htc.autotest.dlib.RecordEngine in loader dalvik.system.DexClassLoader@405178e8
04-23 01:14:20.275: D/WindowManagerImpl(14753): addView, new view, mViews[0]: com.android.internal.policy.impl.PhoneWindow$DecorView@40523840
04-23 01:14:23.368: D/dalvikvm(14753): GC_EXTERNAL_ALLOC freed 17K, 47% free 2901K/5379K, external 1151K/1663K, paused 23ms
04-23 01:14:23.518: D/dalvikvm(14753): GC_EXTERNAL_ALLOC freed 86K, 45% free 2960K/5379K, external 2320K/2875K, paused 24ms
04-23 01:14:23.678: D/dalvikvm(14753): GC_EXTERNAL_ALLOC freed 3K, 45% free 2961K/5379K, external 8073K/10082K, paused 25ms
04-23 01:14:23.798: D/ATRecorder(14753): com.htc.autotest.dlib.RecordEngine in loader dalvik.system.DexClassLoader@4053b728
04-23 01:14:23.878: D/dalvikvm(14753): GC_EXTERNAL_ALLOC freed 10K, 45% free 2969K/5379K, external 13845K/15875K, paused 28ms
04-23 01:14:23.898: D/ATRecorder(14753): com.htc.autotest.dlib.RecordEngine in loader dalvik.system.DexClassLoader@40531240
04-23 01:14:23.908: D/WindowManagerImpl(14753): addView, new view, mViews[1]: com.android.internal.policy.impl.PhoneWindow$DecorView@40512848
04-23 01:14:24.108: W/dalvikvm(14753): threadid=10: thread exiting with uncaught exception (group=0x4001d5a0)
04-23 01:14:24.108: E/AndroidRuntime(14753): FATAL EXCEPTION: Thread-11
04-23 01:14:24.108: E/AndroidRuntime(14753): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.view.ViewRoot.checkThread(ViewRoot.java:3165)
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.view.ViewRoot.requestLayout(ViewRoot.java:677)
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.view.View.requestLayout(View.java:8507)
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.view.View.requestLayout(View.java:8507)
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.view.View.requestLayout(View.java:8507)
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.view.View.requestLayout(View.java:8507)
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.view.View.requestLayout(View.java:8507)
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.view.View.requestLayout(View.java:8507)
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.view.View.requestLayout(View.java:8507)
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.view.View.requestLayout(View.java:8507)
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.view.View.requestLayout(View.java:8507)
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.widget.ImageView.setImageDrawable(ImageView.java:330)
04-23 01:14:24.108: E/AndroidRuntime(14753): at android.widget.ImageView.setImageBitmap(ImageView.java:344)
04-23 01:14:24.108: E/AndroidRuntime(14753): at com.FYP.indoorGPS.TouchImageView.setImageBitmap(TouchImageView.java:153)
04-23 01:14:24.108: E/AndroidRuntime(14753): at com.FYP.indoorGPS.MapActivity.drawMap(MapActivity.java:163)
04-23 01:14:24.108: E/AndroidRuntime(14753): at com.FYP.indoorGPS.MapActivity$1.run(MapActivity.java:31)
04-23 01:14:24.108: E/AndroidRuntime(14753): at java.lang.Thread.run(Thread.java:1027)
04-23 01:14:24.379: D/WindowManagerImpl(14753): finishRemoveViewLocked, mViews[0]: com.android.internal.policy.impl.PhoneWindow$DecorView@40523840
04-23 01:14:24.419: D/WindowManagerImpl(14753): finishRemoveViewLocked, mViews[0]: com.android.internal.policy.impl.PhoneWindow$DecorView@40512848
04-23 01:14:26.030: D/Process(14753): killProcess, pid=14753

谁能告诉我我该怎么做?

最佳答案

我猜问题是您的 Runnable“r”即使在 removeCallbacks() 之后仍在运行。 removeCallbacks() 不会停止正在运行的 Runnable,它只是阻止它启动。

此外,您的refresh() 再次调用“r”,因此它将无限期地调用。因此,如果在“r”运行时调用了 removeCallbacks(),则您没有代码来停止“r”,它将永远循环。

一个解决方案是在您的 Runnable 中有一个循环,并在每个循环结束时调用 Thread.sleep()。然后简单地结束循环以停止 Runnable。

例如,在您的 Runnable 中:

public void run() {
mVar = true;
while (mVar == true){
//do stuff
Thread.sleep(2000);
}

}

让 mVar 成为一个静态变量,您可以将其设置为 false 以结束循环。

此外,我建议不要在 UI 线程上运行此 Runnable,因为它可能会导致您的应用程序在 Thread.sleep(2000) 方法期间停止响应。您可以使用以下内容:

new Thread(r).start();

编辑:如果您要在 Runnable 中处理 View ,那么处理 View 的代码必须从 UI 线程运行。因此,任何改变可运行 View 的代码都需要通过处理程序调用。

关于android - 移动到 tabview 中的另一个选项卡时停止 handler.postDelayed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10269241/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com