您的位置:首页 > 移动开发 > Android开发

菜鸟学android——配置更改导致应用异常的处理方案

2014-03-09 16:03 369 查看
最近注意到一个小细节,拿来和大家分享一下。

我们编写好的代码有时候会在屏幕旋转的时候发生意想不到的事情。下面是一个很简单的例子,布局文件只有一个按钮,就不贴出来了。当点击按钮的时候,按钮变为不可用状态,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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: