2017-01-25 2 views
0

onCreate() 내 활동의 경우 을 예약 할 Timer + TimerTask입니다. mainThread에있는 ParseQuerry 콜백에서 간단한 UI 업데이트를 만들기 위해 인터페이스 콜백을 위임합니다. 이것은 활동을 변경하지 않을 때 작동합니다. 하지만 활동을 종료하고 다시 입력하면 (특정 시점의 활동을 시작할 때만 생성되므로 새 타이머는 여기에 생성되지 않습니다) 작동하지 않습니다. Activity 인스턴스가있는 것 같지만 처리 할 수 ​​없습니다. 성공하지,활동 다시 시작 후 타이머에서 활동 UI 업데이트

public class Utils{ 
....... 

    doParseQuery(Context ctx, MyListener listener){ 
    ....... 

    query.saveInBackground(new SaveCallback() { 
     @Override 
     public void done(ParseException e) { 
      if(e == null){ 
       .... 
       listener.onSuccess(); 
      } 
     } 
    }); 
    } 
} 

내가 시도 무엇 :

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

     .... 
     uiTimer = new Timer(); 
     uiTask = new TimerTask() { 
     @Override 
     public void run() { 

      doParseTask(); 
     } 
     }; 
     uiTimer.schedule(uiTask, shortCodeLeft); 
    } 


    doParseTask(){ 
     Utils.doParseQuery(this, new MyListener{ 
     @Override 
     public void onSuccess() { 
      updateUI(); 
      } 
     }); 
    } 


updateUI(){ 

     Log.i(TAG, "Show changed layout"); //This is always shown, this way I ensure it gets here!! 
     mTextView.setText(foo); //this doesn't work 
     mLayout.setVisibility(View.GONE); //this doesn't work 
    } 

ParseQuerydone() 콜백 메소드에서 실행되고, 나는 UI를 업데이트하는 함수를 호출

1. make the `uiTimer` and `uiTask` static global variables; // I thought that maybe it gets leaked into activity instances 
    2. update the UI using 
     runOnUiThread(new Runnable() { 
          @Override 
          public void run() {} 
         }); 

    OR 

     mLayout.post(new Runnable() { 
          @Override 
          public void run() { 
           mLayout.setVisibility(View.GONE); 
          } 
         }); 
3. android:launchMode= "singleInstance" //in Manifest 

답변

0

당신이 만약 활동이 포 그라운드로 갈 때마다 UITimer가 실행되기를 원하면 onStart 또는 onResume 메소드를 구현해야합니다 uiTimer 구현을 두 메소드 중 하나로 이동하십시오. 이미 시작된 활동이라도 활동을 종료하고 다시 열면이 두 메소드가 호출됩니다. Android 활동 라이프 사이클에 대한 더 자세한 설명은 Google 문서 https://developer.android.com/guide/components/activities/activity-lifecycle.html에 설명되어 있습니다.

코드는 다음과 같습니다

@Override 
protected void onStart() { 
    super.onStart(); 
    .... 
    uiTimer = new Timer(); 
    uiTask = new TimerTask() { 
    @Override 
    public void run() { 

     doParseTask(); 
    } 
    }; 
    uiTimer.schedule(uiTask, shortCodeLeft); 
} 


doParseTask(){ 
    Utils.doParseQuery(this, new MyListener{ 
    @Override 
    public void onSuccess() { 
     updateUI(); 
     } 
    }); 
} 
0

활동에서 당신이 출구는, 인스턴스 mTextView 및 mLayout이 파괴 될 때.

그런 다음 새 액티비티를 만들면 액티비티가 텍스트 뷰 및 레이아웃의 새 인스턴스를 만듭니다.

타이머가 작동을 멈추고 원본 요소를 업데이트하려고합니다. 활동이 닫히면 유효하지 않지만 로그는 여전히 활동과 별개이므로 작동합니다.

당신은에서 onCreate()에서 타이머 & 작업을 초기화하고 기존의 UI 요소 업데이트를 중지하기 위해해야 ​​

@Override 
protected void onStop() { 
    if (uiTimer != null) { 
     uiTimer.cancel(); 
    } 
    super.onStop(); 
}