大家好我有一个切换按钮我想在状态和关闭状态下分别调用方法。我可以为每次点击使用计时器,但我可以得到线程错误任何一个帮助其他合适的方法。这里我附上示例代码:
toggle.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
boolean on = ((ToggleButton) toggle).isChecked();
if (on) {
timer.schedule (hourlyTask, 0l, 1000*60);
} else {
timer1.schedule (hourlyTask1, 0l, 1000*60);
}
});
实施的方法如下:
TimerTask hourlyTask = new TimerTask () {
@Override
public void run () {
// your code here...
ConnectivityManager cn=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo nf=cn.getActiveNetworkInfo();
if(nf != null && nf.isConnected()==true ){
Log.d("Network", "Avalilable");
try {
Socket socket = new Socket();
SocketAddress socketAddress = new InetSocketAddress(host, port);
socket.connect(socketAddress, timeout);
//Log.d("Enable", "yes");
socket.close();
save();
//dbAdapter.deleteentry();
Log.d("Enable", "yes");
//Toast.makeText(getApplicationContext(), "Socket Available", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
Log.e("Socket", e.toString());
}
}
else{
Log.d("Network", "UnAvalilable");
while(nf!=null){
timer2.schedule (hourlyTask2, 0l, 1000*60);
}
}
}
};
05-29 18:47:07.228: W/dalvikvm(32247): threadid=1: thread exiting with uncaught exception (group=0x430ef140)
05-29 18:47:07.228: E/AndroidRuntime(32247): FATAL EXCEPTION: main
05-29 18:47:07.228: E/AndroidRuntime(32247): Process: com.example.poweranalyzer, PID: 32247
05-29 18:47:07.228: E/AndroidRuntime(32247): java.lang.IllegalStateException: TimerTask is scheduled already
05-29 18:47:07.228: E/AndroidRuntime(32247): at java.util.Timer.scheduleImpl(Timer.java:572)
05-29 18:47:07.228: E/AndroidRuntime(32247): at java.util.Timer.schedule(Timer.java:481)
05-29 18:47:07.228: E/AndroidRuntime(32247): at com.example.poweranalyzer.Home$6.onClick(Home.java:257)
05-29 18:47:07.228: E/AndroidRuntime(32247): at android.view.View.performClick(View.java:4478)
05-29 18:47:07.228: E/AndroidRuntime(32247): at android.widget.CompoundButton.performClick(CompoundButton.java:100)
05-29 18:47:07.228: E/AndroidRuntime(32247): at android.view.View$PerformClick.run(View.java:18698)
05-29 18:47:07.228: E/AndroidRuntime(32247): at android.os.Handler.handleCallback(Handler.java:733)
05-29 18:47:07.228: E/AndroidRuntime(32247): at android.os.Handler.dispatchMessage(Handler.java:95)
05-29 18:47:07.228: E/AndroidRuntime(32247): at android.os.Looper.loop(Looper.java:149)
05-29 18:47:07.228: E/AndroidRuntime(32247): at android.app.ActivityThread.main(ActivityThread.java:5257)
05-29 18:47:07.228: E/AndroidRuntime(32247): at java.lang.reflect.Method.invokeNative(Native Method)
05-29 18:47:07.228: E/AndroidRuntime(32247): at java.lang.reflect.Method.invoke(Method.java:515)
05-29 18:47:07.228: E/AndroidRuntime(32247): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
05-29 18:47:07.228: E/AndroidRuntime(32247): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
05-29 18:47:07.228: E/AndroidRuntime(32247): at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:0)
用此更新代码,
toggle.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
boolean on = ((ToggleButton) toggle).isChecked();
if (on) { timer.cancel(); timer= new Timer();
timer.schedule (hourlyTask, 0l, 1000*60);
} else { timer1.cancel(); timer1= new Timer();
timer1.schedule (hourlyTask1, 0l, 1000*60);
}
});
答案 1 :(得分:0)
TimerTask
确实在另一个主题中运行
您可以使用Handler
并向其发送延迟消息。
创建处理程序并覆盖handleMessage:
Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// your code
}
};
发送延迟消息:
handler.sendMessageDelayed(new Message(), 1000*60);
答案 2 :(得分:-1)
你的logcat说
TimerTask is scheduled already
启动时尝试取消其他计时器。因为当切换按钮设置为开,定时器被调度,关闭定时器1被安排。在againe上,它正在尝试安排计划好的计时器。