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.
- Timer y TimerTask en Android
- Actualizar TextView utilizando Timer y ArrayList
- Actualizar una vista de texto aunque el usuario no esté utilizando mi aplicación
- CountDownTimer.cancel () no funciona en Android
- Android: Alternativa de temporizador / retraso
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)
- Android: EditText pierde foco cuando se llama a setText
- Android Java: ¿Cómo restar dos veces?
- Temporizador Android actualizando una vista de texto (UI)
- Eliminación del fondo de una animación de marco en Android
- Timertask o manejador
- Visibilidad de ImageView Error con temporizador
- OnPause / onResume problemas de actividad
- Android: para medir el tiempo entre los dos clics de botón
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(); }
- Android itext usando fuentes de activos y texto utf-8
- Manera correcta de cambiar Collapseble Título de la barra de herramientas