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

本文探讨了在Android应用中,屏幕旋转导致Activity重建时,如何保持按钮禁用状态直至计时结束。通过记录按钮禁用时间和使用onSaveInstanceState与onCreate方法,确保即使在配置改变的情况下也能正确恢复状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近注意到一个小细节,拿来和大家分享一下。

我们编写好的代码有时候会在屏幕旋转的时候发生意想不到的事情。下面是一个很简单的例子,布局文件只有一个按钮,就不贴出来了。当点击按钮的时候,按钮变为不可用状态,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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值