2011-10-23 5 views
7

私はそれをキャンセルした後にもう一度タイマーをスケジュールできるかどうかを知りたいと思います。ここでは、http://www.coderanch.com/t/452066/java/java/Exception-timer-IllegalStateExceptionで、タイマーをキャンセルすると、新しいタイマーを作成しない限り、同じタイマーで何かをスケジュールすることはできません。また、私は、次のエラーが発生しましたjava.lang.IllegalStateException:タイマがキャンセルされました。 私は定期的にWifiスキャンを実行するタイマーを出そうとしています。しかし、私は "一時停止"したい、またはそうでなければ、スキャン後に何らかの計算を行っているときにタイマーをキャンセルすることを望みました。それだけで計算を完了し、いくつかの結果を戻した後、私はタイマーを再開します。この問題を解決するにはどうすればいいのか教えていただけますか?再販されました。キャンセル後のタイマーは「java.lang.IllegalStateException:Timer cancelled」を返します。

忘れてしまったのは、AsyncTaskを使って画像をロードした後にのみタイマーを開始するということです。

これはUIスレッドを保持しないように別のスレッドを達成しようとしています。ここで

は、プログラムの大まかな骨組みであり、時間がイメージが完全にロードされた後にのみelaspedとき、それは無線LANスキャンを実行することになり、タイマーを起動し(「load.execute(コンテキスト);」の後):放送受信のための

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

エラーの出会い:

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

は含まれていたアクセス権を使用します

10-25 05:53:04.903: ERROR/ActivityThread(1551): Activity android.wps.LargeImageScroller has leaked IntentReceiver [email protected] 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 [email protected] 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) 

答えて

0

@Alan Moore:こんにちは、私はついにそれをしたと思います!これはwifiスキャンを実行し、応答をBroadcastインテントを使用して呼び出し元アクティビティに返送することができたコードです。

LargeImageScoll.java(活動)

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(サービス)

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

Runnableハンドラを使用して定期的に設定しようとしましたか?このような何か:あなたが望むようにあなたが遅延を指定して、あなたが実行中で行う必要があるものは何でも行うことができます

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

()。

+0

私が無線LANのスキャンを行うためのコーディングを入れたときに、何もしていないと思われているようです。 – user918197

+0

コードを投稿して、これまでに行ったことを確認できますか? –

+0

は、これまでの例に基づいていたコーディングを追加しました。http://stackoverflow.com/questions/3045227/android-stop-image-scaling-down – user918197

13

ええと、タイマをキャンセルするとスレッドが終了し、再度使用することはできません。タイマーには、一時停止するための組み込みメソッドはありません。 「一時停止」したいときにはタイマーをキャンセルし、「再開」したいときは新しいタイマーにすることができます。

+12

一度.cancel()を呼び出すと、Timerの新しいインスタンスを作成する必要がありますか? – JesusS

+0

@JesusS http://stackoverflow.com/a/21492729/2647910ここにあります – aswzen

3

は最終的に私はそれを解決:D 私はそれを説明する時間がないが、私はあなたとそれを共有するのが好きです。

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

}

関連する問題