2015-08-03 4 views
0

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

частный Логин аннулируются() {

try { 
     EditText userNameET = (EditText)findViewById(R.id.userName); 
     EditText passwordET = (EditText)findViewById(R.id.password); 

     String userName = userNameET.getText().toString(); 
     String password = passwordET.getText().toString(); 

     boolean isLoginOK = isValidUser(userName, password); 
     String autoSynchStrVal = ""; 
     String autoSyncFreqStr = ""; 
     long autoSyncFreqInMiliSec = 3600000; // default 1 hrs 

     if (isLoginOK) { 
      //added by anirban 
      CommonUtils.IS_NEW_VERSION_AVAILABLE = isNewVersionAvailable(); 
      CommonUtils.IS_NEW_Notification_AVAILABLE = isNewNotificationAvailable(); 

      autoSynchStrVal = CommonUtils.getPolicyValue(appInstance, "IS_MOBI_AUTO_SYNCH_REQ", 0, 0); 


      if(autoSynchStrVal != null && !"".equals(autoSynchStrVal) && "1".equals(autoSynchStrVal)){ 
       //boolean isAllTransactionsUploaded = false; 
       // boolean isAllTransactionsUploaded = VersionCheckingActivity.isAllTransactionsUploaded(); 
       // boolean isMobiEligibleForAutoSync = UploadDownload.isMobiEligibleForAutoSync(appInstance ,isAllTransactionsUploaded); 

       // if(isMobiEligibleForAutoSync){ 
       autoSyncFreqStr = CommonUtils.getPolicyValue(appInstance, "MOBI_AUTO_SYNCH_FREQUENCY", 0, 0); 
       if(autoSyncFreqStr != null && !"".equals(autoSyncFreqStr)){ 

        autoSyncFreqInMiliSec = (long) (Double.valueOf(autoSyncFreqStr) * 60 * 60 * 1000); // in millisecond 
       } 




       /* boolean isMobiEligibleForAutoSync = false; 
       try { 
        isMobiEligibleForAutoSync = UploadDownload.isMobiEligibleForAutoSync(appInstance , 
          VersionCheckingActivity.isAllTransactionsUploaded()); 

        if(isMobiEligibleForAutoSync){ 
         _doSynch(); 
        } 

        } catch (UDBAccessException e) { 
         e.printStackTrace(); 
        } */ 




        myTimer = new Timer(); 
        myTimer.schedule(new TimerTask() { 

         @Override 
         public void run() { 
          ULoginActivity.this.runOnUiThread(new Runnable() { 

           @Override 
           public void run() { 
            // here we are checking again for eligibility for auto synch 
            boolean isMobiEligibleForAutoSync = false; 
            try { 
             isMobiEligibleForAutoSync = UploadDownload.isMobiEligibleForAutoSync(appInstance , 
               VersionCheckingActivity.isAllTransactionsUploaded()); 

             Log.d("inside Run : ", "before Synch"); 

             if(isMobiEligibleForAutoSync){ 
              _doSynch(); 

              Log.d("inside Run : ", "after Synch"); 
             } 

            } catch (UDBAccessException e) { 
             e.printStackTrace(); 
            } 


           } 
          }); 

         } 
        }, 1000, autoSyncFreqInMiliSec); //here interval is autoSyncFreqInMiliSec 




      } 


      endAction(RESULT_LOGIN_OK, null); // it will finish the activity 
     } else { 
      // showing login error 
      TextView login_msg = (TextView)findViewById(R.id.login_screen_msg); 
      login_msg.setTextAppearance(this, R.style.error_msg); 
      //login_msg.setTextColor(Color.RED); 
      login_msg.setText("Login failed."); 
     } 
    } catch (UDBAccessException e) { 
     UUIHandlers.showErrorMessage(this, e.getMessage()); 
    }catch (Exception e) { 
     UUIHandlers.showErrorMessage(this, e.getMessage()); 
    } 
} 
+0

Это происходит, когда вы переключаетесь на другую активность в своем приложении или на другое приложение? – Sebastian

+0

К другому действию. Мое намерение отправить данные на сервер в фоновом режиме определенного временного интервала. любая идея относительно этого. –

ответ

0

Если вы держите таймер в поле вашей деятельности (Activity подкласс), то, скорее всего, уйдет, как только вы запускаете другую деятельность. Попробуйте перевести свой таймер на сервисный (Service подкласс). Это будет удерживать ваш таймер независимо от вашего потока активности.

Прочитайте это для справки об услугах: https://developer.android.com/guide/components/services.html

0

Чтобы заставить его работать, когда вы покидаете current activity, вы должны запустить этот код сниппета на background service.

Как вы выполняете на текущем Activity он запускает код в первый раз, но, как вы оставите activity код обыкновение срабатывать себя, если он не зарегистрирован в background service.

Here и here у вас есть примеры того, как использовать их

0

Если вы хотите, чтобы выполнить что-то через какое-то время, даже если ваша деятельность не в настоящее время на переднем плане, вы можете использовать AlarmManager.

Примечание: Диспетчер аварийных сигналов предназначен для случаев, когда вы хотите, чтобы ваш код приложения выполнялся в определенное время, даже если ваше приложение в настоящее время не запущено. Для обычных операций синхронизации (тиков, тайм-аутов и т. Д.) Проще использовать Handler.

Если вы хотите, чтобы периодически отправлять информацию на сервер, я предлагаю вам использовать Service или IntentService.

Служба представляет собой компонент приложения, представляющий либо желание приложения выполнить более длительную работу, не взаимодействуя с пользователем, либо предлагая функциональные возможности для использования другими приложениями.

Вы можете найти хороший пример, используя LocalService также here.

0

Наконец-то получил решение. Теперь из задачи Async (другой поток) вы пытаетесь вставить данные в базу данных, которая заблокирована потоком пользовательского интерфейса. Это вызовет исключение, потому что первая запись имеет блокировку на db.

Смежные вопросы