ProgramingTip

고정 된 시간 간격마다 작업을 반복적으로 실행하는 방법

bestdevel 2020. 12. 7. 20:30
반응형

고정 된 시간 간격마다 작업을 반복적으로 실행하는 방법


Async 작업을 Timer처럼 일정 시간 간격 반복 서버 실행하는 방법 ... 사실 저는에서 읽지 않은 최신 생산을 모두 자동으로 다운로드하는 응용 프로그램을 개발 중이며이를 위해 일부 수정 후 서버 업데이트를 확인해야합니다. 시간 간격 .... 타이머를 통해 쉽게 할 수 있다고 생각하고 안드로이드 애플리케이션에 더 오래 생각하는 작업을 사용하고 싶습니다.


public void callAsynchronousTask() {
    final Handler handler = new Handler();
    Timer timer = new Timer();
    TimerTask doAsynchronousTask = new TimerTask() {       
        @Override
        public void run() {
            handler.post(new Runnable() {
                public void run() {       
                    try {
                        PerformBackgroundTask performBackgroundTask = new PerformBackgroundTask();
                        // PerformBackgroundTask this class is the class that extends AsynchTask 
                        performBackgroundTask.execute();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                    }
                }
            });
        }
    };
    timer.schedule(doAsynchronousTask, 0, 50000); //execute in every 50000 ms
}

  //Every 10000 ms   
       private void doSomethingRepeatedly() {
      Timer timer = new Timer();
      timer.scheduleAtFixedRate( new TimerTask() {
            public void run() {

                  try{

                     new SendToServer().execute(); 

                  }
                  catch (Exception e) {
                      // TODO: handle exception
                  }

             }
            }, 0, 10000);
                     }

만 사용할 수 있습니다.

private int m_interval = 5000; // 5 seconds by default, can be changed later
private Handle m_handler;

@Override
protected void onCreate(Bundle bundle)
{
  ...
  m_handler = new Handler();
}

Runnable m_statusChecker = new Runnable()
{
     @Override 
     public void run() {
          updateStatus(); //this function can change value of m_interval.
          m_handler.postDelayed(m_statusChecker, m_interval);
     }
}

void startRepeatingTask()
{
    m_statusChecker.run(); 
}

void stopRepeatingTask()
{
    m_handler.removeCallback(m_statusChecker);
}

하지만 다음 프레임 워크를 확인하는 것이 좋습니다. http://code.google.com/intl/de-DE/android/c2dm/ 다른 접근 방식입니다. 서버가 준비가되면 전화에 알립니다 (만들고 성능 :))


서비스를 생성하고 알람 관리자를 통해 예약하는 것이 더 많지 않습니까?


받아 들여지는 대답은 문제가 있습니다. 사용하는 것을 통해 작업을 활성화하기 위해 TimerTask ()를 사용하는 것은 나쁜 생각입니다. 호출 방향 변경시 타이머와 호출도 취소해야합니다. 일치하는 경우 각 회전에서 작업을 반복해서 호출합니다. 응용 프로그램이 X 시간 대신 서버 (휴식 http 요청 인 경우)를 날려 버리게합니다. 결국 호출은 매초마다 많은 호출이 발생합니다. (화면 회전 수에 따라 많은 타이머가 있기 때문에). 백그라운드에서 실행되는 작업과 작업이 많으면 응용 프로그램이 중단 될 수 있습니다. 타이머를 사용하면 클래스 memebr로 작성 onStop ()을 취소하십시오.

            TimerTask mDoAsynchronousTask;


            @Override
            public void onStop(){
               super.onStop();                 
               mDoAsynchronousTask.cancel();
               mHandler.removeCallbacks(null);
               ... 
            }


          public void callAsynchronousTask(final boolean stopTimer) {
             Timer timer = new Timer();
             mDoAsynchronousTask = new TimerTask() {
                 @Override
                 public void run() {
                     mHandler.post(new Runnable() {
                 ...

대신 다음 작업을 피하고, 그런 다음 스케줄러 서비스를 사용하여 작업을 실행하십시오. 또는이 좋은 아이디어와 같은 애플리케이션 클래스 : https://fattybeagle.com/2011/02/15/android-asynctasks-during-a-screen-rotation-part-ii/

또는 간단한 방법 (타이머없이 postDelayed 사용)을 사용하고 onStop () 작업을 취소하는 것도 좋은 방법입니다. 이 코드는 postDelayed를 사용하여 잘 작동합니다.

           public class MainActivity extends AppCompatActivity {

                  MyAsync myAsync = new MyAsync();

                  private final Handler mSendSSLMessageHandler = new Handler();
                  private final Runnable mSendSSLRunnable = new Runnable(){

                  ..


                 @Override
                 protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_main);
                    ConnectivityManager connMgr = (ConnectivityManager)   
                    getSystemService(Context.CONNECTIVITY_SERVICE);
                    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
                    if (networkInfo != null && networkInfo.isConnected()) {
                            mSendSSLMessageHandler.post(mSendSSLRunnable);
                    }else
                    ..

                  @Override
                  public void onStop(){
                   super.onStop();
                      if ( progressDialog!=null && progressDialog.isShowing() ){
                           progressDialog.dismiss();
                      }
                    mSendSSLMessageHandler.removeCallbacks(mSendSSLRunnable);
                    myAsync.cancel(false);
                   }


              private final Runnable mSendSSLRunnable = new Runnable(){
              @Override
                public void run(){
                   try {
                    myAsync = new MyAsync();
                    myAsync.execute();
                   } catch (Exception e) {
                      // TODO Auto-generated catch block
                   }
                   mSendSSLMessageHandler.postDelayed(mSendSSLRunnable, 5000);
               }
          };


          class MyAsync extends AsyncTask<Void, Void, String> {
                boolean running = true;

                @Override
                protected void onPreExecute() {
                super.onPreExecute();
                  progressDialog = ProgressDialog.show               
                  (MainActivity.this, "downloading", "please wait");
                }

              @Override
              protected String doInBackground(Void... voids) {
                 if (!running) {
                       return null;
                  }
                 String result = null;
                 try{
                 URL url = new URL("http://192...");
                 HttpURLConnection urlConnection = (HttpURLConnection)            
                 url.openConnection();
                 InputStream in = new BufferedInputStream (urlConnection.getInputStream());
                 result = inputStreamToString(in);
                }catch(Exception e){
                   e.printStackTrace();
                }

               return result;
           }


    @Override
    protected void onCancelled() {
        boolean running = false;
    }
    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        progressDialog.dismiss();
        try {

              ..


        } catch (JSONException e) {
            textView.append("json is invalid");
            e.printStackTrace();
        }

    }


}

참고 URL : https://stackoverflow.com/questions/6531950/how-to-execute-async-task-repeatedly-after-fixed-time-intervals

반응형