2013-09-05 2 views
1

У меня есть таймер, который делает некоторые вещи каждые 5 минут. Вопрос в том, где я должен добавить этот метод? потому что, если я добавлю его в метод «on create», мой метод Timer будет выполняться только при запуске моего приложения. И я хочу выполнить его каждые 5 минут. Спасибо, совет!Метод запуска Android каждые 5 минут

private void timer() { 
    final ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); 
    service.scheduleWithFixedDelay(new Runnable() { 
     @Override 
     public void run() { 
     // fetching file 
     tcpClient.execute(); 
     } 
    }, 0, 60, TimeUnit.SECONDS); 
    } 

EDIT: это выглядит как я нужен AlarmManager, как Питер Бердсолл и Александр Lidtke сказал EDIT2: Теперь у меня есть AlarmManager инициализирован, но до сих пор я не могу запустить этот метод каждые 5 минут, я новый для Android, где я должен это назвать? Если я добавлю его в метод create on, он будет выполняться только один раз, но я хочу, чтобы он выполнялся вечно, каждые 5 минут.

ЭТА Сохраненный ME https://github.com/rakeshcusat/Code4Reference/blob/master/AndroidProjects/AlarmManagerExample/AndroidManifest.xml

+1

«если я добавить его в„на создание“метод моего метод таймера выполняется только при запуске моего приложения» и Каковы ваши намерения? Это каждые 5 минут, пока приложение работает или каждые 5 минут независимо? –

+1

Каждые 5 минут независимо. Купить было бы нормально начать каждые 5 минут, когда мое приложение будет работать – Petrica

+0

Если вы хотите сделать это независимо от того, работает ли приложение, вам нужна услуга и широковещательный приемник для 'android.intent.action.BOOT_COMPLETED', который запустит вашу службу всякий раз, когда телефон работает. Если вы хотите сделать это в приложении, попробуйте поиграть с onResume и onStart. –

ответ

4

Поместите это в OnCreate, это будет не только выполнить один раз, я абсолютно уверен.

  Timer myTimer = new Timer(); 
      myTimer.schedule(new TimerTask() { 
       @Override 
       public void run() { 
        tcpClient.execute(); 
       } 
      }, 0, 300000); 
+0

Как насчет вращения экрана? –

+0

@Grzegorz Таймер сбрасывается. – superuser

+0

Я пробовал, он выполнил один раз onl – Petrica

0

Пробуйте использовать время действия галочки. Вот статья, которая покажет вам, как это сделать. Очень просто.

http://androidbridge.blogspot.ca/2011/08/how-to-use-actiontimetick-broadcast.html

Это клещей каждую минуту, так что потом в приемником вы просто хотите включить что-то вроде

tick++ 
if(tick>=5) 
{ 
    //Do what you want to do here 

    tick=0; 
} 
else 
{ 
    return; 
} 
+0

О, и для того, чтобы быть ясным, вам нужно объявить тик как переменную int в начале вашей деятельности, чтобы она не выходила из области видимости. – NathanTempelman

1

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

Вот моя основная деятельность. Я запускаю последовательности с помощью кнопок.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ... 

} 



Button.OnClickListener btnOnClickListener = new Button.OnClickListener() { 

    @Override 
    public void onClick(View v) { 

     if (v == btn_splash) { 
       initiateAlarm(true); 
       Toast.makeText(MainActivity.this, " alarm scheduled", Toast.LENGTH_LONG).show(); 
      } 
      } else if (v == btn_cancel) 
       { 

       initiateAlarm(false); 

       Toast.makeText(MainActivity.this, " alarm stopped", Toast.LENGTH_LONG).show(); 
       } 
    } 

}; 



} 

public void initiateAlarm(Boolean bactive) { 
     alarmUp = false; 
     alarmUp = (PendingIntent.getBroadcast(getBaseContext(), 0, 
       new Intent(this, YourService.class), 
       PendingIntent.FLAG_NO_CREATE) != null); 
       if (alarmUp) 
        { 
        Log.d("myTag", "Alarm is already active"); 
        Toast.makeText(this, " before scheduling Alarm is already active", Toast.LENGTH_LONG).show(); 
        } else { 

         YourReceiver.scheduleAlarms(this, prefDuration, bactive); 
         Toast.makeText(this, "alarms were just scheduled", Toast.LENGTH_LONG).show(); 
        } 


     alarmUp = false; 
     alarmUp = (PendingIntent.getBroadcast(getBaseContext(), 0, 
       new Intent(this, YourService.class), 
       PendingIntent.FLAG_NO_CREATE) != null); 
       if (alarmUp) 
        { 
        Log.d("myTag", "Alarm is already active"); 
        Toast.makeText(this, " after scheduling Alarm is already active", Toast.LENGTH_LONG).show(); 
        } 
} 

} 

Это YourReceiver, который планирует службу в диспетчере будильника.

public class YourReciever extends BroadcastReceiver { 

private static final String TAG = "YourReciever"; 



@Override 
public void onReceive(Context ctxt, Intent i) { 
    context = ctxt; 

    scheduleAlarms(ctxt, (long) 3600001, true); // 1 hour - not used 

} 

static void scheduleAlarms(Context ctxt, Long duration, Boolean bactive) { 

    Log.e(TAG, " ... scheduleAlarms "); 
    SharedPreferences preferences; 

    preferences = PreferenceManager.getDefaultSharedPreferences(ctxt); 
    prefDuration = preferences.getLong(PREF_DURATION, 3600000); // 1 hour 
    Log.e(TAG, " ... onReceive ... duration: " + duration); 

AlarmManager mgr= 
    (AlarmManager)ctxt.getSystemService(Context.ALARM_SERVICE); 
Intent i=new Intent(ctxt, YourService.class); 
PendingIntent pi=PendingIntent.getService(ctxt, 0, i, 0); 


mgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, 
       SystemClock.elapsedRealtime() + duration, duration, pi); 
if (bactive == false) { 
    mgr.cancel(pi); 
} 


} 

} 

и, наконец, вот класса обслуживания

public class YourService extends IntentService { 




public YourService() { 
    super("YourService"); 
    Log.e(TAG, " ... YourService"); 

} 


@Override 
protected void onHandleIntent(Intent intent) { 


// 
// The action you want to perform. 
// 


} 

} 

Что-то вроде этого нужно быть в манифесте.

<service 
     android:name="com.yourpackagename.YourService" 
     android:exported="true"/> 

Надеюсь, это поможет.

Удачного дня.

+0

спасибо за этот подсказку, я посмотрю, что я могу сделать: D – Petrica

-1

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

private final long refreshDelay = 5 * 1000; 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      //setContentView(R.layout.main); 

      sendHttpRequestThread = new SendHttpRequestThread("",""); 
      sendHttpRequestThread.start(); 

     } 

    class SendHttpRequestThread extends Thread { 

      boolean sendHttpRequest; 
      String userId; 
      String pass; 

      public SendHttpRequestThread(String str1, String str2) { 
       this.userId = str1; 
       this.pass = str2; 
       sendHttpRequest = true; 
      } 

      public void stopSendingHttpRequest() { 
       sendHttpRequest = false; 
      } 

      protected void onStop() { 
       sendHttpRequestThread.stopSendingHttpRequest(); 
       super.stop(); 
      } 

      @Override 
      public void run() { 
       while (sendHttpRequest) { 
        //Call U r function from here 

        SystemClock.sleep(refreshDelay); 
       } 
      } 
     } 
+0

Я использовал этот вызов, чтобы отправить HTTP-запрос каждые 5 секунд. Вот что вы хотите надеяться, что это поможет u – Developer

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