菜鸟学android——配置更改导致应用异常的处理方案
2014-03-09 16:03
369 查看
最近注意到一个小细节,拿来和大家分享一下。
我们编写好的代码有时候会在屏幕旋转的时候发生意想不到的事情。下面是一个很简单的例子,布局文件只有一个按钮,就不贴出来了。当点击按钮的时候,按钮变为不可用状态,5s后,按钮恢复可用状态:
可是当我们按下按钮,再旋转屏幕,有意思的事情就发生了,按钮立即变为可用状态,而不是等到5s后。这是为什么呢??原来旋转屏幕、语言变化等情况会导致配置的更改,这时当前的Activity实例会被销毁,而重新创建一个,所以就发生了上述情况。解决方案如下:
再试试,发现即使按下按钮马上旋转屏幕,按钮也不会立即恢复可用状态。
除此之外,还从网上浏览到另一种解决方法,链接:
http://www.jb51.net/article/32241.htm
我们编写好的代码有时候会在屏幕旋转的时候发生意想不到的事情。下面是一个很简单的例子,布局文件只有一个按钮,就不贴出来了。当点击按钮的时候,按钮变为不可用状态,5s后,按钮恢复可用状态:
package com.example.hello; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity implements OnClickListener { Button bt; boolean flag = false; Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if(msg.what == 0x11) { bt.setEnabled(true); try { thread.join(); thread = null; } catch(Exception e) {} } } }; Thread thread; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bt = (Button)findViewById(R.id.button1); bt.setOnClickListener(this); } public void onClick(View v) { bt.setEnabled(false); thread = new Thread() { public void run() { try { sleep(5000); handler.sendEmptyMessage(0x11); } catch(Exception e) {} } }; thread.start(); } }
可是当我们按下按钮,再旋转屏幕,有意思的事情就发生了,按钮立即变为可用状态,而不是等到5s后。这是为什么呢??原来旋转屏幕、语言变化等情况会导致配置的更改,这时当前的Activity实例会被销毁,而重新创建一个,所以就发生了上述情况。解决方案如下:
package com.example.hello; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity implements OnClickListener { Button bt; long time = 0;//记录按钮已被禁用了多长时间 Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if(msg.what == 0x11) { bt.setEnabled(true); time = 0;//置零 try { thread.join(); thread = null; } catch(Exception e) {} } } }; Thread thread; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bt = (Button)findViewById(R.id.button1); bt.setOnClickListener(this); ////////////////////////////////////////////////////////////////////////////////////// if(savedInstanceState != null &&savedInstanceState.containsKey("TIME")) { final long value = savedInstanceState.getLong("TIME");//读取已被禁用的时间 bt.setEnabled(false); thread = new Thread() { public void run() { time = System.currentTimeMillis();//记录开始时间 try {//恢复原来的状态 sleep(5000 - value); handler.sendEmptyMessage(0x11); } catch(Exception e) {} } }; thread.start(); } ////////////////////////////////////////////////////////////////////////////////////// } public void onClick(View v) { bt.setEnabled(false); thread = new Thread() { public void run() { time = System.currentTimeMillis();//记录开始时间 try { sleep(5000); handler.sendEmptyMessage(0x11); } catch(Exception e) {} } }; thread.start(); } ////////////////////////////////////////////////////////////////////////////////////// @Override public void onSaveInstanceState(Bundle outState) {//记录旧状态 super.onSaveInstanceState(outState); if(thread != null && thread.isAlive()) { time = System.currentTimeMillis() - time;//按钮已被禁用的时间 try { thread.join(); thread = null; } catch(Exception e) {} outState.putLong("TIME", time);//存储已被禁用的时间 } } ////////////////////////////////////////////////////////////////////////////////////// }
再试试,发现即使按下按钮马上旋转屏幕,按钮也不会立即恢复可用状态。
除此之外,还从网上浏览到另一种解决方法,链接:
http://www.jb51.net/article/32241.htm
相关文章推荐
- Android:Consumer closed input channel or an error occurred. events=0x8异常导致程序异常终止问题解决方案
- Android 系列 6.4通过将视图从模型中去耦来处理配置更改
- 菜鸟的DUBBO进击之路(八):配置抽离导致${jdbc.url}被当成字符串处理
- Android应用开发之(你必须知道的“避免内存溢出图片处理方案”)
- Android应用全局异常处理
- Android 关于没有处理异常导致应用程序崩溃的处理
- Android中破解应用签名校验的后续问题处理方案(闪退和重启现象以及无效问题)
- Android应用开发之(你必须知道的“避免内存溢出图片处理方案”)
- 菜鸟学Android笔记(十四):web的应用目录及如何配置主页?
- Android应用开发之(你必须知道的“避免内存溢出图片处理方案”)
- Android学习之 应用崩溃异常处理
- Java mail使用QQ邮箱发送邮件配置方案及异常处理
- Android 之 应用未捕获异常处理
- 对于异常出现,而导致android崩溃的处理
- Android应用捕获全局异常自定义处理
- Android处理未捕获的异常(应用全局异常)
- android应用开发-------------应用崩溃全局异常捕获处理(UncaughtExceptionHandler)
- Android应用配置错误导致不能编译--配成系统应用
- Android应用全局异常处理
- android:configChanges配置不当,应用被回收重启,导致应用崩溃