2017-02-06 1 views
1

정기적으로 AJAX 호출을 사용하여 서버에서 데이터를 가져 와서 그에 따라 UI를 업데이트하려면 Android 앱이 필요합니다 (setText로 업데이트해야하는 TextViews)). 나는 이것에 대한 간단한 AsyncTask를 사용 - 내가 응답을 수신하면Android : AsyncTask를 사용하여 반복 된 Ajax 호출을 수행하는 더 나은 방법

Ajax 호출을 이해 해봐, 그리고 UI를 업데이트 :이 두 작업을 포함한다는

참고.

- 위에서 반복적으로, 정기적 인 간격으로.

성능 향상을 위해 AsyncTask를 반복 호출하는 방법이 두 가지 중 어느 것인지 잘 모르겠습니다.

방법 1 : 내부 에서 onCreate 방법하지만 하나 개 AsyncTask를 요청의 완료 전에 것이이 방법으로 생각하는 문제에서 반복) (실행 호출, 다른 AsynTask 요청이 올 수도 있습니다 (시간을 처리하는 경우 요청은 일정 지연 시간 이상입니다.) 대기열에 많은 요청이있을 수있어 궁극적으로 성능에 해를 끼칠 수 있습니다. 방법 2

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_display_list_view); 

    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 { 
         new AjaxRequestTask().execute(); // Async Call 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
        } 
       } 
      }); 
     } 
    }; 
    timer.schedule(doAsynchronousTask, 0, 2000); //execute in every 2000 ms 
} 

다음 내부 의 onPostExecute에서 반복) (실행하지만이 방법으로 생각하는 문제는 재귀 될 모든에 AjaxRequestTask의 새로운 개체를 호출 호출 하나 이전하기 전에 생성됩니다 파괴되고 많은 AsynTask 객체가 메모리에 존재하여 궁극적으로 성능에 해를 끼칠 수있는 상황이 발생할 것입니다.

protected void onPostExecute(String result) { 

    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 { 
         new AjaxRequestTask.execute(); // Async Call 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
        } 
       } 
      }); 
     } 
    }; 
    timer.schedule(doAsynchronousTask, 0, 2000); 


} 

답변

0

AsyncTask.execute 실행 순차적으로 즉 당신이 AsyncTask.execute 당신의 작업자 스레드가 대기열에 추가됩니다 사용할 때마다, 당신이 이전에 추가 작업 (FIFO)의 완성을 기다릴 필요가 의미합니다. AsyncTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, params)을 사용하면 AsyncTask이라는 병렬이 만들어 지므로 기다릴 필요가 없습니다.

AsyncTask 또는 Runnable의 수를 제한하기 위해 ThreadPoolExecutor 또는 ExecutorService을 만들 수 있습니다.

당신은 당신이 yourCustomPoolExector.shutdownNow를 호출하여 모든 AjaxRequestTask 년대를 취소 할 수 있습니다 언제든지 수영장 집행

ExecutorService yourCustomPoolExector = Executors.newFixedThreadPool(5); // 5 is max number of tasks 
AjaxRequestTask.executeOnExecutor(yourCustomPoolExector, params); 

를 작성하여이 작업을 수행 할 수 있습니다.

원하는 기능을 일정한 간격으로 수행하려면 Sync Adapter을 고려해보십시오.하지만이 기능을 사용할 필요는 없습니다.

0

RxJava 라이브러리를 백그라운드로 반복하여 작업하는 것이 더 나은 해결책입니다. 당신이 그것을 더 이상

if (null != repeatingTask && !repeatingTask.isUnsubscribed()) { repeatingTask.unsubscribe(); repeatingTask = null; { 
을 필요로하지 않을 때

Subscription repeatingTask = 
Observable.interval(10, TimeUnit.SECONDS) 
.observeOn(Schedulers.computation()) 
.map(t -> { 
// make your request here, it is done on background thread already 
Response r = makeRequest(); 
return r; 
}) 
// process result on a main thread 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe (r -> { 
processResponse(r); 
}, 
e -> { 
processError(e); 
}; 

가 작업을 취소 RxJava 1로 그것은 모양을

관련 문제