0

조각은 네트워크에서 n 초마다 데이터를 새로 고쳐야합니다. 조각이 일시 중지되면 그 작업을 중단해야합니다. 또한 이후에 네트워크 데이터가 에 도달하면 조각이 일시 중지되므로 무시해야합니다. 지금반복되는 AsyncTask를 구현하는 라이프 사이클 인식 방법은 무엇입니까?

, AsyncTask를하고 응답 다시 처리기에 AsyncTask를 게시물을 작성하는 핸들러의 sendMessageDelayed 매 n 초를 사용하여 메신저. 그런 다음 Handler가 UI를 업데이트합니다.

그러나 조각이 일시 중지되거나 활동이 완료되면 메모리 누수가 발생합니다. 또한

의 조각은 NPE에게 줄 것이다 UI를 업데이트, 더 이상 활성화

아래의 코드는 꽤 순진 및 메모리 가득이 그것을 할 수있는 한 가지 방법은

class MyFragment : Fragment() { 
    override fun onPause() { 
     super.onPause() 
     handler.removeMessages(Consts.FETCH_DATA) //stop refreshing when paused 
    } 

    override fun onResume() { 
     super.onResume() 
     val msg = handler.obtainMessage(Consts.FETCH_DATA) 
     handler.sendMessageDelayed(msg, 60*1000) //start refreshing again 
    } 
    val handler = MyHandler() 

    inner class MyHandler: Handler(){ 
     override fun handleMessage(m: Message) { 
      val pair = m.obj as Pair<String, Any> 
      val command = pair.first 
      val data = pair.second 
      when(m.what){ 
       Consts.POPULATE_DATA -> { 
        //findViewById and put data 
        //schedule the next refresh 
        val msg = obtainMessage(Consts.FETCH_DATA) 
        sendMessageDelayed(msg, 60*1000) 
       } 
       Consts.FETCH_DATA -> { 
        MyAsyncTask(this).execute() 
        //this sends Consts.POPULATE_DATA to this handler 
        //after a network request 
       } 
      } 
     } 
    } 
} 
+1

당신은 AsyncTask –

+0

대신 @ AsunTaskLoader를 사용해야한다고 생각합니다. @sunilkushwah AsyncTaskLoader. 나는 그것이 그랬다고 생각한다. 내가 핸들러 제거 경우의 데이터, 매 n 초, 다시로드 비 지저분한 방법은? – arnab321

+0

핸들러는 것도 좋은 방법입니다하지만 u는 변경하려는 경우 당신은 안드로이드에 타이머를 사용할 수 있지만 –

답변

0

이다 누수 . 모든 sendMessageDelayed하기 전에 당신은 다음 Activity

public class MyFragment extends Fragment{ 
boolean isActivity; 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     isActivity = true; 
    } 

@Override 
    protected void onStop() { 
     super.onStop(); 
     isActivity = false; 
    } 


} 

isActivity를 추가 Fragment의 검증 및 Activity

if(isActivity && isFragment){ 
sendMessageDelayed(msg, 60*1000); 
} 

을 확인 if 성명을 호출 할 그리고 같은 당신 Fragment

public class MainActivity extends Activity{ 
boolean isFragment; 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     isFragment= true; 
    } 

@Override 
    public void onStop() { 
     super.onStop(); 
     isFragment= false; 
    } 

} 
에 대한

isActivity과입니다.public static 당신이 응용 프로그램을 최소화하거나 더 이상 호출되지 않습니다 sendMessageDelayed 활동을 닫을 때 호출되는 다른 클래스

이로써

Activity가 실행되고 ForegroundsendMessageDelayed에서에서 사용할 경우

관련하려면 자세히보기 Activity and Fragment Lifycicle