2011-10-23 15 views
7

मैं जानना चाहता हूं कि मैं इसे रद्द करने के बाद टाइमर को फिर से शेड्यूल कर सकता हूं या नहीं। यह यहां बताया गया था, http://www.coderanch.com/t/452066/java/java/Exception-timer-IllegalStateException, कि एक बार जब आप टाइमर रद्द कर देते हैं, तब तक एक ही टाइमर पर कुछ भी शेड्यूल करना संभव नहीं होगा जब तक कि मैं एक नया टाइमर नहीं बनाता। और साथ ही, मुझे निम्न त्रुटि का सामना करना पड़ा, java.lang.IllegalStateException: टाइमर रद्द कर दिया गया था। मैं एक टाइमर के साथ बाहर आने की कोशिश कर रहा हूं जो नियमित रूप से वाईफ़ाई स्कैनिंग करेगा। लेकिन जब मैं स्कैनिंग के बाद कुछ गणना कर रहा हूं तो टाइमर को "रोकें" या नहीं, तो मैंने रद्द कर दिया। केवल गणना पूरी करने के बाद और कुछ परिणाम वापस लौटने के बाद, मैं टाइमर फिर से शुरू करूंगा। क्या कोई मुझे बता सकता है कि मैं इस समस्या को हल करने में कैसे जा सकता हूं?पुन: स्थापित। रद्द करने के बाद टाइमर "java.lang.IleglegalStateException: टाइमर रद्द कर दिया।"

यह उल्लेख करने के लिए भूल गया कि मैं छवियों को लोड करने के बाद ही टाइमर शुरू करूंगा, जिसे मैंने ऐसा करने के लिए AsyncTask का उपयोग किया था।

मैं इसे एक अलग धागा हासिल करने की कोशिश कर रहा हूं ताकि यह यूआई थ्रेड को पकड़ न सके।

यहां कार्यक्रम के किसी न किसी कंकाल है और टाइमर जहां यह वाईफ़ाई स्कैनिंग प्रदर्शन करेंगे जब समय elasped के बाद ही छवि पूरी तरह से लोड किया गया है शुरू (के बाद "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

@ आलॉन मूर: हाय, मुझे लगता है कि मैंने अंततः इसे किया! यह वह कोड है जो वाईफाई स्कैन करने में सक्षम था और ब्रॉडकास्ट इरादे का उपयोग करके कॉलिंग गतिविधि पर प्रतिक्रिया वापस भेजता था।

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

क्या आपने एक रननेबल हैंडलर का उपयोग करके इसे नियमित अंतराल पर सेट करने का प्रयास किया है? कुछ इस तरह:

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

अपनी इच्छानुसार जहां देरी निर्दिष्ट करें और आप जो कुछ भी आप समय में करने की ज़रूरत क्या कर सकते हैं()।

+0

ऐसा लगता है जब मैं एक वाईफ़ाई स्कैन करने के लिए codings शब्दों में कहें, ऐसा लगता है कि कि कुछ भी नहीं किया जाता है। – user918197

+0

क्या आप अपना कुछ कोड पोस्ट कर सकते हैं ताकि हम देख सकें कि आपने अभी तक क्या किया है? –

+0

कोडिंग जो पहले यहां से उदाहरण से आधारित था, http://stackoverflow.com/questions/3045227/android-stop-image-scaling-down। – user918197

13

हाँ, टाइमर को रद्द करना इसके धागे को समाप्त करता है ताकि आप इसे फिर से उपयोग न कर सकें। टाइमर में रोके जाने के लिए कोई अंतर्निहित विधियां नहीं हैं। जब आप "रोकें" चाहते हैं तो आप टाइमर को रद्द कर सकते हैं और जब आप "फिर से शुरू करना" चाहते हैं तो एक नया बना सकते हैं।

+12

में देरी का समय बदल सकते हैं तो एक बार जब आप कॉल कर सकते हैं .cancel() आपको टाइमर का एक नया उदाहरण बनाना होगा? – JesusS

+0

@ जेससएस http://stackoverflow.com/a/21492729/2647910 यहां यह है – aswzen

3

अंत में मैं इसे हल: डी मैं इसे समझाने के लिए समय नहीं है लेकिन मैं इसे आपके साथ साझा करना चाहता हूं।

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

}

संबंधित मुद्दे