问题发生环境:
TabAcitivity中的每个tab标签管理一个ActivityGroup,每个ActivityGroup管理多个Acitivity,
在其中一个Activity中在使用Spinner控件时,使用代码:
resolutionSpinner = (Spinner) findViewById(R.id.resolutionSpinner); resolutionAdapter = ArrayAdapter.createFromResource(this.getParent(), R.array.resolutionItem, android.R.layout.simple_spinner_item); resolutionAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); resolutionSpinner.setAdapter(resolutionAdapter);
点击Spinner控件时,系统崩溃,出现如下报错:
E/AndroidRuntime(26975): FATAL EXCEPTION: main E/AndroidRuntime(26975): android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActivityManager$LocalActivityRecord@4137c7b8 is not valid; is your activity running? E/AndroidRuntime(26975): at android.view.ViewRootImpl.setView(ViewRootImpl.java:704) E/AndroidRuntime(26975): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:313) E/AndroidRuntime(26975): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215) E/AndroidRuntime(26975): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140) E/AndroidRuntime(26975): at android.view.Window$LocalWindowManager.addView(Window.java:539) E/AndroidRuntime(26975): at android.app.Dialog.show(Dialog.java:278) E/AndroidRuntime(26975): at android.app.AlertDialog$Builder.show(AlertDialog.java:932) E/AndroidRuntime(26975): at android.widget.Spinner$DialogPopup.show(Spinner.java:703) E/AndroidRuntime(26975): at android.widget.Spinner.performClick(Spinner.java:458) E/AndroidRuntime(26975): at android.view.View$PerformClick.run(View.java:14325) E/AndroidRuntime(26975): at android.os.Handler.handleCallback(Handler.java:605) E/AndroidRuntime(26975): at android.os.Handler.dispatchMessage(Handler.java:92) E/AndroidRuntime(26975): at android.os.Looper.loop(Looper.java:137) E/AndroidRuntime(26975): at android.app.ActivityThread.main(ActivityThread.java:4512) E/AndroidRuntime(26975): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime(26975): at java.lang.reflect.Method.invoke(Method.java:511) E/AndroidRuntime(26975): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:978) E/AndroidRuntime(26975): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745) E/AndroidRuntime(26975): at dalvik.system.NativeStart.main(Native Method)
问题原因及解决方法:
由报错可知是弹出的Spinner选项窗口找不到可以依附的context,但我使用的明明是getParent()的上下文,当时奇怪了,纠结了好久,搞了半天,后发现如下网站找到了解决方法,原来是加载Acitivity的布局文件方式导致的,但为什么会导致这种情况呢?先看看两种加载方式:
之前使用的是:
onCreate(savedInstanceState); this.setContentView(R.layout.camera_video1)
修改后:
super.onCreate(savedInstanceState); View viewToLoad = LayoutInflater.from(this.getParent()).inflate(R.layout.camera_video1, null); this.setContentView(viewToLoad);显然,修改后加载布局文件方式中使用了this.getParent(),获取到了上一级context,这样再弹出子窗口就能找到依附的对象。
参考网站:
http://stackoverflow.com/questions/7609519/android-spinner-error-android-view-windowmanagerbadtokenexception-unable-to
原来tomcat一直可用,但后来可能安装了许多基于java的软件,使得在执行startup.bat文件启动tomcat时,tomcat startup.bat启动时,启动窗口一闪而过,无法启动Tomcat,也无法看到报错信息。
对tomcat的无法启动,很多时候是由于JAVA_HOME 或者 JRE_HOME环境变量导致的,但是启动屏幕一闪而过,在很短暂的时间内无法看清楚错误信息怎么办?
此时只需要在startup.bat文件中加入一行pause代码语句,即可使启动文件在执行过程中暂停,即可发现详细错误详细。
我的startup.bat启动文件部分配置代码如下所示,我在文件最后面加上一行pause语句代码,保存文件,然后再次执行startup.bat启动脚本,即可暂停启动脚本的执行:
----------------------------------------
rem Get remaining unshifted command line arguments and save them in the
set CMD_LINE_ARGS=
:setArgs
if ""%1""=="""" goto doneSetArgs
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
shift
goto setArgs
:doneSetArgs
call "%EXECUTABLE%" start %CMD_LINE_ARGS%
pause
:end
----------------------------------------
启动脚本暂停执行之后,发现屏幕中报出了如下错误: “Neither the JAVA_HOME nor the JRE_HOME environment variable is defined ”,这报错意思已经很明显了,提示我电脑中既没有定义JAVA_HOME环境变量,也没有定义JRE_HOME环境变量,所以我需要手工加上JAVA_HOME环境变量。
我的java安装在D:\Program Files\Java\jdk1.7.0_01目录,所以按照以下方法添加JAVA_HOME环境变量,问题得到解决。
接项目时防止甲方拖欠款项的绝招。
不过需要链接网络,借用了第三方网站 "http://www.bjtime.cn"
下面看代码吧……咩哈哈哈哈。。。。
String timeString = jsonObject.getString("time").substring(0, 7); // 双重保险,最好能获得系统时间,以免第三方网站异常时程序无法运行 try { URL url = new URL("http://www.bjtime.cn"); URLConnection uc = url.openConnection(); uc.connect(); long time = uc.getDate(); // 获得时间戳 SimpleDateFormat simpleDateFormat = new SimpleDateFormat( "yyyy-MM"); //定义想要的格式 timeString = simpleDateFormat.format(time); } catch (Exception e) { e.printStackTrace(); } if (timeString.equals("2012-12")) //我把时间设定成为2012年12月有效 getData(); else { Message message = handler .obtainMessage(Constant.OVERDUE_DIALOG); message.sendToTarget(); // 给个程序过期的提示吧! }