• 全部
  • 音视频
  • Camera
  • UI
  • 协议
  • SDK
  • Android Studio
  • 问答

帮我看看这段定时器代码,总崩溃!

wugamp 2017-02-07 10:15:31
想练习一下定时器的使用,编写了下面的代码。
设计要求是:进程启动后,只要人不主动关闭它,它就会不断在自己的界面上显示一个越来越大的数字,每 2s 累加一次。哪怕锁屏、放到后台、启动其他进程等,它也会照样累加。
但是实际用下来经常崩溃,具体来说:
1、如果执行了 onPause() 之后,再执行 onStart,则必崩溃;
2、如果不关闭前一个进程,同时新开一个同样的进程,则必崩溃;就是说这个 APP 不允许同时有两个实例;
3、放到后台运行或者锁屏后,有时也会崩溃,但也有时不崩溃。

下面是代码,请问问题在哪里呢?谢谢!

public class MainActivity extends AppCompatActivity {
private int g_iCounter =0;
private final Timer g_timer = new Timer();
private TimerTask g_task;
TextView g_tv = null;

Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
g_iCounter++;
String s = String.format("%d", g_iCounter);
g_tv.setText(s);
super.handleMessage(msg);
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
g_tv = (TextView)findViewById(R.id.textView);

g_task = new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
};
}

public void onStart(View view) { //点击 START 按钮时执行本函数,开始计数
g_timer.schedule(g_task, 2000, 2000);
}

public void onPause(View view) { //点击 PAUSE 按钮时执行本函数,暂停计数
g_timer.cancel();
}
...全文
141 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xiaohuh421 2017-02-10
真机一样能看log啊........
回复
wugamp 2017-02-08
引用 2 楼 qiguangyaolove 的回复:
回复第一条:timer被cancle以后就不能再schedule了,timertask只能被schedule一次 将你的代码改了改,timer和timertask放到onstart方法中去实例化
public void onStart(View view) { // 点击 START 按钮时执行本函数,开始计数
		g_timer = new Timer();
		g_task = new TimerTask() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				Message message = new Message();
				message.what = 1;
				handler.sendMessage(message);
			}
		};
		g_timer.schedule(g_task, 1000, 1000);
	}
至于后两条,比较不好解释,app实例化的问题楼上已经回答,放到后台运行崩溃,由于信息量太少也无法定位,实在是说不出来
多谢,照你的方法修改后问题都没有了。我所谓的后面两条问题,应该是自己乱搞弄出来的伪问题。这就结贴献分!
回复
wugamp 2017-02-08
引用 1 楼 xiaohuh421 的回复:
不管是哪种情况下崩溃, 你记得看崩溃日志, 这样就能找到问题的根本原因, 不要看到崩溃就不管了. 在一般的android系统中, 所有app都只能单开, 只有特殊的版本支持双开,甚至多开.
是啊,我也是想看LOG。但是我没有模拟器(不知道什么原因,总是装不成功),只能在真机上调。而且我对 ANDROID 的 LOG 还不熟悉,里面有那么多文件,不知道该看哪个,头大啊!
回复
qiguangyaolove 2017-02-08
回复第一条:timer被cancle以后就不能再schedule了,timertask只能被schedule一次 将你的代码改了改,timer和timertask放到onstart方法中去实例化
public void onStart(View view) { // 点击 START 按钮时执行本函数,开始计数
		g_timer = new Timer();
		g_task = new TimerTask() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				Message message = new Message();
				message.what = 1;
				handler.sendMessage(message);
			}
		};
		g_timer.schedule(g_task, 1000, 1000);
	}
至于后两条,比较不好解释,app实例化的问题楼上已经回答,放到后台运行崩溃,由于信息量太少也无法定位,实在是说不出来
回复
xiaohuh421 2017-02-08
不管是哪种情况下崩溃, 你记得看崩溃日志, 这样就能找到问题的根本原因, 不要看到崩溃就不管了. 在一般的android系统中, 所有app都只能单开, 只有特殊的版本支持双开,甚至多开.
回复
发帖
Android
创建于2009-10-09

7.8w+

社区成员

移动平台 Android
申请成为版主
帖子事件
创建了帖子
2017-02-07 10:15
社区公告
暂无公告