2017-01-25 18 views
0

onCreate()私の活動の方法では、私はTimer + TimerTaskで、ParseQueryを予定しています。 mainThreadにあるParseQuerryコールバックで、簡単なUI更新を行うためにインターフェイスコールバックを委任します。これは、アクティビティを変更しない場合に機能します。しかし、アクティビティを終了してもう一度入力すると(ここでは新しいタイマーは作成されません。特定のポイントからアクティビティを開始したときにのみ作成されるためです)、動作しません。私はActivityインスタンスを持つものだと思っていますが、私はそれを処理できません。アクティビティを再起動した後、アクティビティUIを更新する

ParseQuerydone()コールバックメソッドで実行され
@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 
    } 

、私はUIを更新関数を呼び出す:

public class Utils{ 
....... 

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

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

ノー成功を収めて、試してみました何:

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の実装を両方のメソッドのどちらかに移動します。あなたのアクティビティが既に開始されていても、この2つのメソッドは、アクティビティを終了して再度開くと呼び出されます。 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(); 
} 
関連する問題