Resched。定时器取消后给出" java.lang.IllegalStateException:定时器取消" [英] Resched. timer after cancel gives "java.lang.IllegalStateException: Timer cancelled."

查看:200
本文介绍了Resched。定时器取消后给出" java.lang.IllegalStateException:定时器取消"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道我是否能重新安排这些计时器后,我将其取消。在这里指出,的http://www.$c$cranch.com/t/452066/java/java/Exception-timer-IllegalStateException,一旦您取消了计时器,它不可能在同一个定时安排任何事情,除非我创建了一个新的计时器。还有,我遇到了以下错误, java.lang.IllegalStateException:定时器被取消。 我想拿出一个计时器,将定期执行无线扫描。但我想暂停,或者如果不是,取消了计时器,当它被扫描后进行一些计算。只有这样,之后完成计算并返回一些成果,我将恢复定时器。谁能告诉我,我怎么可以去在得到这个问题解决了吗?

忘了提到,只有当我完成这在我以前的AsyncTask做加载图像,我会开始计时。

我想实现这一个单独的线程,这样就不会耽误UI线程。

下面是该方案的大致框架,并启动定时器哪里会进行无线扫描时,时间elasped只后的图像已经被完全加载(后的 load.execute(上下文); ):

 公共类LargeImageScroller延伸活动{
@覆盖
公共无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
        的setContentView(新SampleView(本));
}
@覆盖
公共布尔onCreateOptionsMenu(功能菜单){...}

@覆盖
公共布尔onOptionsItemSelected(菜单项项){...}

//这是类所在的程序将执行所有的用户界面和显示图像
私有静态类SampleView扩展视图{

    公共SampleView(上下文的背景下){
                    :
        loadMap负荷=新loadMap();
        load.execute(上下文);

        scanTask =新的TimerTask(){

            @覆盖
            公共无效的run(){
                // TODO自动生成方法存根
               handler.post(新的Runnable(){
                        公共无效的run(){
                         无线=(WifiManager)context.getSystemService(WIFI_SERVICE);
                         context.registerReceiver(receiverWifi,新的IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
                         wifi.startScan();
                         Log.d(定时器,定时器引爆);
                        }
               });
            }

        };

        scanTimer.schedule(scanTask,刷新率);
    }

    公共类wifiReceiver扩展的BroadcastReceiver {

        @覆盖
        公共无效的onReceive(上下文的背景下,意图意图){
            // TODO自动生成方法存根
            名单< ScanResult> SC = wifi.getScanResults();
            的for(int i = 0; I< sc.size();我++){
                Log.e(AndroidRuntime,sc.get(ⅰ).SSID);
            }
        }

    }
    公共布尔的onTouchEvent(MotionEvent事件){...}
    保护无效的OnDraw(帆布油画){...}
    私有静态绘制对象LoadImageFromWebOperations(字符串URL){...}
    私有静态位图德codeFILE(文件f,INT requiredSize){...}
    私有类loadMap扩展的AsyncTask<背景下,无效的ArrayList<位图>> {...}
}
 

使用被列入该权限:

 <使用-权限的Andr​​oid:名称=android.permission.ACCESS_WIFI_STATE/>
<使用-权限的Andr​​oid:名称=android.permission.CHANGE_WIFI_STATE>< /使用-许可>
<使用-权限的Andr​​oid:名称=android.permission.WRITE_EXTERNAL_STORAG​​E>< /使用-许可>
<使用-权限的Andr​​oid:名称=android.permission.DELETE_CACHE_FILES>< /使用-许可>
<使用-权限的Andr​​oid:名称=android.permission.INTERNET对>< /使用-许可>
 

有关广播接收错误的邂逅:

  5月10日至25日:53:04.903:ERROR / ActivityThread(1551):活动android.wps.LargeImageScroller渗漏IntentReceiver android.wps.LargeImageScroller$SampleView$wifiReceiver@43d1bca0这是原本在这里注册。是否缺少调用unregisterReceiver()?
五月10日至二十五日:53:04.903:ERROR / ActivityThread(1551):android.app.IntentReceiverLeaked:活动android.wps.LargeImageScroller渗漏最初注册到了这里IntentReceiver android.wps.LargeImageScroller$SampleView$wifiReceiver@43d1bca0。是否缺少调用unregisterReceiver()?
10-25 05:53:04.903:ERROR / ActivityThread(1551):在android.app.ActivityThread $ PackageInfo $ ReceiverDispatcher< INIT>(ActivityThread.java:797)
五月10日至二十五日:53:04.903:ERROR / ActivityThread(1551):在android.app.ActivityThread $ PackageInfo.getReceiverDispatcher(ActivityThread.java:608)
五月10日至二十五日:53:04.903:ERROR / ActivityThread(1551):在android.app.ApplicationContext.registerReceiverInternal(ApplicationContext.java:724)
五月10日至二十五日:53:04.903:ERROR / ActivityThread(1551):在android.app.ApplicationContext.registerReceiver(ApplicationContext.java:711)
五月10日至二十五日:53:04.903:ERROR / ActivityThread(1551):在android.app.ApplicationContext.registerReceiver(ApplicationContext.java:705)
五月10日至二十五日:53:04.903:ERROR / ActivityThread(1551):在android.content.ContextWrapper.registerReceiver(ContextWrapper.java:308)
五月10日至二十五日:53:04.903:ERROR / ActivityThread(1551):在android.wps.LargeImageScroller $ SampleView $ 1 $ 1.运行(LargeImageScroller.java:187)
五月10日至二十五日:53:04.903:ERROR / ActivityThread(1551):在android.os.Handler.handleCallback(Handler.java:587)
五月10日至二十五日:53:04.903:ERROR / ActivityThread(1551):在android.os.Handler.dispatchMessage(Handler.java:92)
五月10日至二十五日:53:04.903:ERROR / ActivityThread(1551):在android.os.Looper.loop(Looper.java:123)
五月10日至二十五日:53:04.903:ERROR / ActivityThread(1551):在android.app.ActivityThread.main(ActivityThread.java:4363)
五月10日至二十五日:53:04.903:ERROR / ActivityThread(1551):在java.lang.reflect.Method.invokeNative(本机方法)
五月10日至二十五日:53:04.903:ERROR / ActivityThread(1551):在java.lang.reflect.Method.invoke(Method.java:521)
五月10日至二十五日:53:04.903:ERROR / ActivityThread(1551):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:860)
五月10日至二十五日:53:04.903:ERROR / ActivityThread(1551):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
五月10日至二十五日:53:04.903:ERROR / ActivityThread(1551):在dalvik.system.NativeStart.main(本机方法)
 

解决方案

@Alan摩尔:你好,我想我终于做到了!这是code,它能够进行无线扫描,并利用广播意图发回的响应返回给调用活动。

LargeImageScoll.java(活动)

 意向意图;

公共静态的Runnable scanTask;

公众的BroadcastReceiver的BroadcastReceiver =新的BroadcastReceiver(){
    @覆盖
    公共无效的onReceive(上下文的背景下,意图意图){
        //的updateUI(意向);
        //字符串returnedValue = intent.getStringExtra(数据);
        捆绑包= intent.getExtras();
        字符串returnedValue = bundle.getString(数据);
        Log.e(啥子,returnedValue);
    }
};

私有静态处理程序处理程序=新的处理程序(){

    @覆盖
    公共无效的handleMessage(信息MSG){
        // TODO自动生成方法存根
        super.handleMessage(MSG);
    }

};

公共类LargeImageScroller延伸活动{
@覆盖
公共无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
        的setContentView(新SampleView(本));

        意图=新的意图(这一点,WifiScanning.class);
}
@覆盖
公共布尔onCreateOptionsMenu(功能菜单){...}

@覆盖
公共布尔onOptionsItemSelected(菜单项项){...}

//这是类所在的程序将执行所有的用户界面和显示图像
私有静态类SampleView扩展视图{

    公共SampleView(上下文的背景下){
                :
    loadMap负荷=新loadMap();
    load.execute(上下文);

    scanTask =新的Runnable(){
    @覆盖
    公共无效的run(){
    // TODO自动生成方法存根
    startService(新意图(背景下,WifiScanning.class));
    };

    handler.removeCallbacks(scanTask);
    handler.postDelayed(scanTask,刷新率);
}

公共布尔的onTouchEvent(MotionEvent事件){...}
保护无效的OnDraw(帆布油画){...}
私有静态绘制对象LoadImageFromWebOperations(字符串URL){...}
私有静态位图德codeFILE(文件f,INT requiredSize){...}
私有类loadMap扩展的AsyncTask<背景下,无效的ArrayList<位图>> {...}

} // SampleView结束

保护无效onResume(){
    // TODO自动生成方法存根
    Log.e(AndroidRuntime,onResume);
    handler.removeCallbacks(scanTask);
    handler.postDelayed(scanTask,刷新率);
    registerReceiver(BroadcastReceiver的,新的IntentFilter(WifiScanning.BROADCAST_ACTION));
    super.onResume();
}

@覆盖
保护无效的onStop(){
    // TODO自动生成方法存根
    Log.e(AndroidRuntime,的onStop);
    unregisterReceiver(BroadcastReceiver的);
    stopService(新意图(这一点,WifiScanning.class));
    handler.removeCallbacks(scanTask);
    super.onStop();
}
} // LargeImageScroll结束
 

WifiScanning.java(服务)

 公共静态最后弦乐BROADCAST_ACTION =android.wps.wifiscanning.broadcasttest;
INT计数器= 0;
意图int​​ent1;
WifiReceiver receiverWifi =新WifiReceiver();
WifiManager无线网络;
StringBuilder的某人;
名单< ScanResult> wifiList;

公共无效的onCreate(){
    super.onCreate();

    intent1 =新的意图(BROADCAST_ACTION);
    Log.e(TAG,服务创造);
    无线=(WifiManager)getSystemService(Context.WIFI_SERVICE);
    registerReceiver(receiverWifi,新的IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
    如果(计数器== 0){
    Log.e(AndroidRuntime,扫描的+专柜+时间);
    wifi.startScan();
    反++;
    }
}

类WifiReceiver扩展的BroadcastReceiver {
    公共无效的onReceive(上下文C,意图意图){
        SB =新的StringBuilder();
        wifiList = wifi.getScanResults();
        的for(int i = 0; I< wifiList.size();我++){
            sb.append([+(wifiList.get(我).SSID)的ToString()+] [);
            sb.append((wifiList.get(我).BSSID)的ToString()+] [);
            sb.append((将String.valueOf(wifiList.get(ⅰ).LEVEL))+]);
            sb.append(\ N);
        }
        Log.e(AndroidRuntime,sb.toString());
        如果(计数器4;){
            Log.e(AndroidRuntime,扫描的+专柜+时间);
            wifi.startScan();
            反++;
        }其他{
            intent1 =新的意图(BROADCAST_ACTION);
            字符串测试= sb.toString();
            intent1.putExtra(数据,测试);
            sendBroadcast(intent1);
        }
    }
}

@覆盖
公共无效的onDestroy(){
    // TODO自动生成方法存根
    unregisterReceiver(receiverWifi);
    super.onDestroy();
}
 

i would like to know whether i can schedule the timer again after i cancelled it. It was stated here, http://www.coderanch.com/t/452066/java/java/Exception-timer-IllegalStateException, that once you cancelled the timer, it would not be possible to scheduling anything on the same timer unless i create a new Timer. And also, i encountered the following error, java.lang.IllegalStateException: Timer was cancelled. I am trying to come out with a Timer that would regularly perform Wifi scanning. But i wished to "pause" or if not, cancelled the timer when it is performing some calculation after scanning. Only then after it complete the calculation and return some results back, i would resume the Timer. Can anyone tell me how i can go about in getting this problem solved?

Forgotten to mentioned that i would start the timer only after i finished loading images which i used AsyncTask to do that.

I trying to achieved this one a separate thread so that it would not hold up the UI thread.

Here is the rough skeleton of the program and start timer where it would perform wifi scanning when time elasped only after the image have been loaded completely (after "load.execute(context);"):

public class LargeImageScroller extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
        setContentView(new SampleView(this));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {...}

@Override
public boolean onOptionsItemSelected(MenuItem item) {...}

//this is the class where the program would do all the UI and display images
private static class SampleView extends View {

    public SampleView(Context context) {
                    :
        loadMap load = new loadMap();
        load.execute(context);

        scanTask = new TimerTask(){

            @Override
            public void run() {
                // TODO Auto-generated method stub
               handler.post(new Runnable() {
                        public void run() {
                         wifi = (WifiManager)context.getSystemService(WIFI_SERVICE);
                         context.registerReceiver(receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
                         wifi.startScan();
                         Log.d("TIMER", "Timer set off");
                        }
               });
            }

        };

        scanTimer.schedule(scanTask, refreshRate);
    }

    public class wifiReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            List<ScanResult> sc = wifi.getScanResults(); 
            for(int i=0; i<sc.size(); i++){
                Log.e("AndroidRuntime", sc.get(i).SSID);
            }
        }

    }
    public boolean onTouchEvent(MotionEvent event) {...}
    protected void onDraw(Canvas canvas) {...}
    private static Drawable LoadImageFromWebOperations(String url){...}
    private static Bitmap decodeFile(File f, int requiredSize){...}
    private class loadMap extends AsyncTask<Context, Void, ArrayList<Bitmap>>{...}
}

Uses Permission that was included:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.DELETE_CACHE_FILES"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>

Error encounter for the Broadcast receiver:

10-25 05:53:04.903: ERROR/ActivityThread(1551): Activity android.wps.LargeImageScroller has leaked IntentReceiver android.wps.LargeImageScroller$SampleView$wifiReceiver@43d1bca0 that was originally registered here. Are you missing a call to unregisterReceiver()?
10-25 05:53:04.903: ERROR/ActivityThread(1551): android.app.IntentReceiverLeaked: Activity android.wps.LargeImageScroller has leaked IntentReceiver android.wps.LargeImageScroller$SampleView$wifiReceiver@43d1bca0 that was originally registered here. Are you missing a call to unregisterReceiver()?
10-25 05:53:04.903: ERROR/ActivityThread(1551):     at android.app.ActivityThread$PackageInfo$ReceiverDispatcher.<init>(ActivityThread.java:797)
10-25 05:53:04.903: ERROR/ActivityThread(1551):     at android.app.ActivityThread$PackageInfo.getReceiverDispatcher(ActivityThread.java:608)
10-25 05:53:04.903: ERROR/ActivityThread(1551):     at android.app.ApplicationContext.registerReceiverInternal(ApplicationContext.java:724)
10-25 05:53:04.903: ERROR/ActivityThread(1551):     at android.app.ApplicationContext.registerReceiver(ApplicationContext.java:711)
10-25 05:53:04.903: ERROR/ActivityThread(1551):     at android.app.ApplicationContext.registerReceiver(ApplicationContext.java:705)
10-25 05:53:04.903: ERROR/ActivityThread(1551):     at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:308)
10-25 05:53:04.903: ERROR/ActivityThread(1551):     at android.wps.LargeImageScroller$SampleView$1$1.run(LargeImageScroller.java:187)
10-25 05:53:04.903: ERROR/ActivityThread(1551):     at android.os.Handler.handleCallback(Handler.java:587)
10-25 05:53:04.903: ERROR/ActivityThread(1551):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-25 05:53:04.903: ERROR/ActivityThread(1551):     at android.os.Looper.loop(Looper.java:123)
10-25 05:53:04.903: ERROR/ActivityThread(1551):     at android.app.ActivityThread.main(ActivityThread.java:4363)
10-25 05:53:04.903: ERROR/ActivityThread(1551):     at java.lang.reflect.Method.invokeNative(Native Method)
10-25 05:53:04.903: ERROR/ActivityThread(1551):     at java.lang.reflect.Method.invoke(Method.java:521)
10-25 05:53:04.903: ERROR/ActivityThread(1551):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
10-25 05:53:04.903: ERROR/ActivityThread(1551):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
10-25 05:53:04.903: ERROR/ActivityThread(1551):     at dalvik.system.NativeStart.main(Native Method)

解决方案

@Alan Moore: Hi, i guess i finally did it! this is the code that was able to perform wifi scan and send back the response back to the calling activity using Broadcast intent.

LargeImageScoll.java (Activity)

Intent intent;

public static Runnable scanTask;

public BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        //updateUI(intent); 
        //String returnedValue = intent.getStringExtra("data");
        Bundle bundle = intent.getExtras();
        String returnedValue = bundle.getString("data");
        Log.e("Waht", returnedValue);
    }
};

private static Handler handler = new Handler(){

    @Override
    public void handleMessage(Message msg) {
        // TODO Auto-generated method stub
        super.handleMessage(msg);
    }

};

public class LargeImageScroller extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
        setContentView(new SampleView(this));

        intent = new Intent(this, WifiScanning.class);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {...}

@Override
public boolean onOptionsItemSelected(MenuItem item) {...}

//this is the class where the program would do all the UI and display images
private static class SampleView extends View {

    public SampleView(Context context) {
                :
    loadMap load = new loadMap();
    load.execute(context);

    scanTask = new Runnable(){
    @Override
    public void run() {
    // TODO Auto-generated method stub
    startService(new Intent(context, WifiScanning.class));  
    };

    handler.removeCallbacks(scanTask);
    handler.postDelayed(scanTask, refreshRate);
}

public boolean onTouchEvent(MotionEvent event) {...}
protected void onDraw(Canvas canvas) {...}
private static Drawable LoadImageFromWebOperations(String url){...}
private static Bitmap decodeFile(File f, int requiredSize){...}
private class loadMap extends AsyncTask<Context, Void, ArrayList<Bitmap>>{...}

}//end of SampleView

protected void onResume() {
    // TODO Auto-generated method stub
    Log.e("AndroidRuntime", "onResume");
    handler.removeCallbacks(scanTask);
    handler.postDelayed(scanTask, refreshRate);
    registerReceiver(broadcastReceiver, new IntentFilter(WifiScanning.BROADCAST_ACTION));
    super.onResume();
}

@Override
protected void onStop() {
    // TODO Auto-generated method stub
    Log.e("AndroidRuntime", "onStop");
    unregisterReceiver(broadcastReceiver);
    stopService(new Intent(this, WifiScanning.class));
    handler.removeCallbacks(scanTask);
    super.onStop();
}
}//end of LargeImageScroll

WifiScanning.java (Service)

public static final String BROADCAST_ACTION = "android.wps.wifiscanning.broadcasttest";
int counter = 0;
Intent intent1;
WifiReceiver receiverWifi = new WifiReceiver();
WifiManager wifi;
StringBuilder sb;
List<ScanResult> wifiList;

public void onCreate() {
    super.onCreate();

    intent1 = new Intent(BROADCAST_ACTION); 
    Log.e(TAG, "Service creating");
    wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    registerReceiver(receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
    if(counter==0){
    Log.e("AndroidRuntime", "Scan for the "+counter+" time");
    wifi.startScan();
    counter++;
    }
}

class WifiReceiver extends BroadcastReceiver {
    public void onReceive(Context c, Intent intent) {
        sb = new StringBuilder();
        wifiList = wifi.getScanResults();
        for(int i = 0; i < wifiList.size(); i++){
            sb.append("["+ (wifiList.get(i).SSID).toString() + "][");
            sb.append((wifiList.get(i).BSSID).toString() + "][");
            sb.append((String.valueOf(wifiList.get(i).level)) + "]");
            sb.append("\n");
        }
        Log.e("AndroidRuntime", sb.toString());
        if(counter<4){
            Log.e("AndroidRuntime", "Scan for the "+counter+" time");
            wifi.startScan();
            counter++;
        }else{
            intent1 = new Intent(BROADCAST_ACTION);
            String test = sb.toString();
            intent1.putExtra("data", test);
            sendBroadcast(intent1);
        }
    }
}

@Override
public void onDestroy() {
    // TODO Auto-generated method stub
    unregisterReceiver(receiverWifi);
    super.onDestroy();
}

这篇关于Resched。定时器取消后给出&QUOT; java.lang.IllegalStateException:定时器取消&QUOT;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆