简体   繁体   English

Android Timer出现错误

[英]Android Timer getting error

Hi guys i have one toggle button i want to invoke the method on separately on state and off state. 嗨,大家好,我有一个切换按钮,我想分别在打开状态和关闭状态下调用该方法。 i can use the timer for each click but i can get the thread error any one help Other suitable method.Here i attached the sample code: 我可以为每次单击使用计时器,但可以通过任何一种帮助获得线程错误。其他合适的方法。在此附上示例代码:

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

And the implemented method is given below: 实现方法如下:

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)

update code with this, 以此更新代码,

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

TimerTask indeed runs in another thread. TimerTask确实在另一个线程中运行。
You can use a Handler and send a delayed message to it. 您可以使用Handler并向其发送延迟的消息。

  • Creating the Handler and overriding handleMessage: 创建处理程序并覆盖handleMessage:

     Handler handler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { super.handleMessage(msg); // your code } }; 
  • Sending the delayed message: 发送延迟的消息:

     handler.sendMessageDelayed(new Message(), 1000*60); 

your logcat says 你的logcat说

TimerTask is scheduled already

Try cancelling the other timer when you start one. 启动一个计时器时,请尝试取消另一个计时器。 because when toggle button is set on, timer is scheduled, off timer1 is scheduled. 因为将切换按钮设置为打开时,已安排了计时器,所以已关闭了timer1。 ON againe, it is trying to schedule the timer which is alreasy scheduled. 再次打开,它正在尝试安排容易安排的计时器。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM