2015-09-18 2 views
0

Я создал службу в андроиде, который работает по два потока одновременно один через каждые 30 секунд и другой через каждые 5 минут. стенд из них, вызывающий апи. до тех пор, пока мой телефон не подключится к системе, чтобы наблюдать за журналами, он работает нормально, но поскольку я отключу телефон от системы 5 минут, нить запускает неправильное поведение, он не запускается через каждые 5 минут.Нитки в обслуживании не работают должным образом

Вот мой код.

if (fivemiuntesHandler == null) { 

      Log.d(TAG, "Location update started five minutes ..............: "); 
      fivemiuntesHandler = new Handler(); 

      fivemiuntesHandler.postDelayed(fiveminutes, 300000); 

     } 

     if (thirtysecHandler == null) { 
      Log.d(TAG, "Location update started five minutes ..............: "); 
      thirtysecHandler = new Handler(); 
      thirtysecHandler.postDelayed(thirtySec, 0); 

     } 


private Runnable fiveminutes = new Runnable() { 
     @Override 
     public void run() { 
      // TODO Auto-generated method stub 



      sharedPreferences = getSharedPreferences("user_detail", 
        MODE_WORLD_WRITEABLE); 
      login_id = sharedPreferences.getString("login_id", ""); 
      url = sharedPreferences.getString("url", ""); 

      responseArray= null; 
      response= null; 
      try { 

       URL URl; 

       byte[] data; 

       String lat_current_pos = null, lng_current_pos = null,address_base64 = null,lat_base64,lng_base64; 



        lat_current_pos = lat; 
        lng_current_pos=lng; 





       data = gcm_id.getBytes("UTF-8"); 
       String gcm_base64 = Base64.encode(data); 
       data = login_id.getBytes("UTF-8"); 
       String login_base64 = Base64.encode(data); 


       if(Settings.Secure.getInt(getContentResolver(), Settings.Secure.LOCATION_MODE)!=0 && Settings.Secure.getInt(getContentResolver(), Settings.Secure.LOCATION_MODE) !=1){ 
        data = getAddress(new LatLng(Double.valueOf(lat_current_pos), Double.valueOf(lng_current_pos))).getBytes("UTF-8"); 
        address_base64 = Base64.encode(data); 
        }else 
        { 

         data = "LOCATION_MODE_OFF".getBytes("UTF-8"); 
         address_base64 = Base64.encode(data); 


        } 

       if(Settings.Secure.getInt(getContentResolver(), Settings.Secure.LOCATION_MODE)==0 || Settings.Secure.getInt(getContentResolver(), Settings.Secure.LOCATION_MODE)==1) 
       { 

        data = "".getBytes("UTF-8"); 
        lat_base64 = Base64.encode(data); 
        data = "".getBytes("UTF-8"); 
        lng_base64 = Base64.encode(data); 

       }else{ 
       data = lat_current_pos.getBytes("UTF-8"); 
       lat_base64 = Base64.encode(data); 
       data = lng_current_pos.getBytes("UTF-8"); 
       lng_base64 = Base64.encode(data); 

       } 
       data = name.getBytes("UTF-8"); 
       String name_base64 = Base64.encode(data); 

       data = "I".getBytes("UTF-8"); 
       String flag_base64 = Base64.encode(data); 



        URl = new URL(
          getResources().getString(R.string.services_push_lat_lng)); 



       List<NameValuePair> liNameValuePairs = new ArrayList<NameValuePair>(); 

       liNameValuePairs.add(new BasicNameValuePair("login_id", 
         login_base64)); 
       liNameValuePairs.add(new BasicNameValuePair("gcm_id", gcm_base64)); 
       if(address_base64==null) 
       { 
       liNameValuePairs.add(new BasicNameValuePair("address", "")); 
       }else 
        liNameValuePairs.add(new BasicNameValuePair("address", address_base64));  
       liNameValuePairs.add(new BasicNameValuePair("lat", lat_base64)); 
       liNameValuePairs.add(new BasicNameValuePair("lon", lng_base64)); 
       liNameValuePairs.add(new BasicNameValuePair("name", name_base64)); 
       if (url.contains("boss.xsinfosol.com")) { 
        liNameValuePairs 
          .add(new BasicNameValuePair("flag", flag_base64)); 

       } 
       ApiCallingclass apiCallingclass = new ApiCallingclass(); 
        responseArray = apiCallingclass.callApi(liNameValuePairs, URl); 
       response = responseArray[0]; 
       System.out.println("5 minutes " + response +" "+login_id); 
      } catch (UnknownHostException e) { 
       e.printStackTrace(); 

      } 

      catch (Exception e) { 
       // TODO: handle exception 
       e.printStackTrace(); 

      } 



      fivemiuntesHandler.postDelayed(fiveminutes, 300000); 



     } 
    }; 


private Runnable thirtySec = new Runnable() { 



     @Override 
     public void run() { 
      // TODO Auto-generated method stub 

      update_current_location_tracker uLocation_tracker = new update_current_location_tracker(); 
      uLocation_tracker.execute(); 


      thirtysecHandler.postDelayed(thirtySec, 30000); 

     } 

    }; 

Так что, пожалуйста, помогите мне в этом.

+0

попытайтесь установить свой сервис exported = "true", установив эту службу в свой собственный процесс, как приложение, независимо, надеюсь, тогда вы не получите эту ошибку. –

+0

Обратите внимание, что runnables с обработчиками не запускаются в отдельном потоке. Они все еще находятся в потоке службы. –

+0

. Вы можете проверить, есть ли какая-либо ошибка в стеке из 5-минутного обработчика. Ошибки времени выполнения, такие как нулевые указатели, могут не быть захвачены блоком try-catch. Или попробуйте post post в блоке 'finally'. В общем, как объясняется в ответе ниже, вы должны использовать будильник для долгосрочных повторяющихся заданий. – headuck

ответ

1

«пока мой телефон подключен к системе, чтобы смотреть журналы он работает нормально, но, как я отключить телефон ...»

Проблема заключается в том, что при подключении к системе Дев, устройство зарядки и (обычно) не перейдет в состояние полного сна. Это особенно актуально, если у вас включена опция dv для включения устройства при подключении через USB. Как только вы отключитесь от системы dev, Android очень агрессивно относится к управлению питанием и перейдет в состояние ожидания. Ваши потоки не будут работать до тех пор, пока устройство не появится достаточно долго, чтобы дать им время процессора, что неопределенно.

Используйте AlarmManager или JobScheduler для установки повторяющихся операций и координации с управлением питанием.

+0

Да, вы правы, я получаю такую ​​же проблему, но несколько дней назад она работала нормально, и теперь это не так. Менеджер не повторяет задачу после выполнения задачи один раз. Поэтому, пожалуйста, расскажите, как запустить поток в службе, даже когда телефон находится в спящем режиме. –

+0

'AlarmManager' может выполнять повторяющиеся задачи (см. Методы' setInexactRepeating() 'и' setRepeating() '). Вы не можете запускать поток в 'Сервис', находясь в спящем режиме. По определению телефон спит, и на процессоре ничего не работает. 'AlarmManager' и/или' JobScheduler' - ваши лучшие варианты. Даже используя 'AlarmManager', вам нужно будет координировать свой код с помощью блокировки слежения, чтобы вы гарантировали выполнение кода' Service'. –

+0

Я просто сталкиваюсь с проблемой в потоке, который работает через 5 минут, и поток, который работает через каждые 30 секунд, работает нормально. В Alarm Manager setRepeating() и setInexactRepeating() не работает в kit-kat и выше –