Android计时器出错

时间:2015-05-29 13:04:48

标签: android sync timertask

大家好我有一个切换按钮我想在状态和关闭状态下分别调用方法。我可以为每次点击使用计时器,但我可以得到线程错误任何一个帮助其他合适的方法。这里我附上示例代码:

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);
                }
           }
        }
};

Log Cat:

        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)

3 个答案:

答案 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上,它正在尝试安排计划好的计时器。