Resched. Timer after cancel da "java.lang.IllegalStateException: Timer cancelado."

Me gustaría saber si puedo programar el temporizador de nuevo después de haber cancelado. Se declaró aquí, http://www.coderanch.com/t/452066/java/java/Exception-timer-IllegalStateException , que una vez que canceló el temporizador, no sería posible programar nada en el mismo temporizador a menos que Crear un nuevo temporizador. Y también, encontré el siguiente error, java.lang.IllegalStateException: Timer fue cancelado. Estoy intentando salir con un contador de tiempo que realizaría regularmente la exploración de Wifi. Pero yo quería "pausa" o si no, canceló el temporizador cuando se realiza algún cálculo después de la exploración. Sólo entonces, después de completar el cálculo y devolver algunos resultados, reanudaría el temporizador. ¿Puede alguien decirme cómo puedo ir sobre conseguir este problema resuelto?

Se olvidó de mencionar que iba a iniciar el temporizador sólo después de terminar de cargar imágenes que he utilizado AsyncTask para hacer eso.

Estoy tratando de lograr este un hilo separado para que no se sostiene el hilo de interfaz de usuario.

Aquí está el esqueleto áspero del programa y del temporizador del comienzo en donde realizaría la exploración del wifi cuando el tiempo se ensoldó solamente después de que la imagen se haya cargado completamente (después de " load.execute (contexto); "):

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>>{...} } 

Usos Permiso que se incluyó:

 <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> 

Detección de errores para el receptor Broadcast:

 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) 

Sí, cancelar el temporizador termina su hilo para que no pueda volver a usarlo. El temporizador no tiene ningún método incorporado para pausar. Puede cancelar el temporizador cuando quiera "pausar" y crear uno nuevo cuando quiera "reanudar".

FINALMENTE LO SOLUCIONO: D no tengo tiempo para explicarlo pero me gusta compartirlo contigo.

 import java.util.Timer; import java.util.TimerTask; import sociatag.view.main_frame; public class devices_pinger implements Runnable { // PROPERTIES: private int delay = 1000; // delay for 1 seconds. private int period = 6000; // repeat every 6 seconds. private boolean stop_timer = false; // CONSTRACTOR: public devices_pinger() { } // METHODES: /* * because we implements Runnable in this class, * this methode run() has to run this class on a seperate thread. * - call the start pinger methode * * @param: event occured on the serial */ @Override public void run() { run_pinger(); } /* * this is the start point of this class * - create a scheduler to run every x seconds * - call the run methode every x seconds to: * - send 'P' through the serial * - wait x seconds * - call the ping analyser to get all the replyed pings and analyse them */ private void run_pinger() { new Timer().schedule(new TimerTask() { @Override public void run() { // 1) ping the connected device serial_connection.serial_write('P'); System.out.println("> PING (Send P)");//<------TESTING-------------------------------------------- // pause for 3 seonds to give time for all the devices to response try { Thread.sleep(3000); // call the analyser after 3 seconds } catch (InterruptedException ex) { System.out.println("Error: while pausing the thread"); } // 2) get the result of the ping to analyze it serial_listener.ping_analyser(); if (stop_timer == true) { this.cancel(); } } }, delay, period); } /* * stop the timer before pairing the devices or do other activities */ public void stop_pinger() { stop_timer = true; main_frame.display_notification("Device Pinger is paused."); } /* * restart the pinger by creating new instance of timer */ public void start_pinger() { stop_timer = false; run_pinger(); main_frame.display_notification("Device Pinger is running.."); } 

}

¿Ha intentado utilizar un controlador Runnable y establecerlo a intervalos regulares? Algo como esto:

 private Handler mUpdateHandler = new Handler(); private Runnable mUpdateRunnable = new Runnable() { public void run() { mUpdateHandler.postDelayed(this, delay); } }; mUpdateHandler.postDelayed(mUpdateRunnable, delay); 

Donde se especifica el retraso como se desea y se puede hacer lo que sea necesario hacer en run ().

@ Alan Moore: Hola, supongo que finalmente lo hice! Este es el código que fue capaz de realizar análisis wifi y devolver la respuesta a la actividad de la llamada utilizando la intención de difusión.

LargeImageScoll.java (Actividad)

 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 (Servicio)

 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(); } 
  • Cómo detener un temporizador después de cierto número de veces
  • ¿Temporizador Android? ¿Cómo?
  • Programación de Android Timer vs. scheduleAtFixedRate
  • Cómo determinar si la tarea del temporizador ha finalizado
  • No recibe datos de ubicación del hilo
  • Android - No puede eliminar la red Wifi de forma programática El método removeNetwork (int) en el tipo WifiManager no es aplicable a los argumentos (String)
  • Cambiar horario scheduleAtFixedRate
  • Hacer un temporizador de intervalo en Java android
  • CountDownTimer en Android
  • Visibilidad de un botón en el temporizador
  • Eventos retardados en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.