2016-11-15 6 views
1

にコールバックを削除します。Androidの私は以下のようにコードを持ってpostdelayed xml要素

myelement.postDelayed(new Runnable() { 
    public void run() { 
     myelement.setVisibility(View.GONE); 
    } }, 8000); 

私は、これはコールバック毎回onStop()またはonPauseを(削除する)が起こります。私がしようとしたとき

handler.removeCallbacks(null); 
handler.removeCallbacksAndMessages(null); 
handler.removeCallbacks(runnable); 

は、私はあなたが行うことができ、他のSOの記事で読ん

public synchronized void onPause() {  // on pause 
    myelement.removeCallbacks(null); 
    super.onPause();       
} 

と、前後の活動の間に行くことを試みました。しかし、私がこれをやろうとしたとき、要素が半秒間、時には完全な秒間に表示されるように、要素がちょうどぎれることがありました。

答えて

1

removeCallback()メソッドは実行可能であるため、参照を保持する必要があります。

例えば:

public class DemoActivity extends AppCompatActivity { 

    private static final String TAG = "Demo"; 
    private Handler mHandler; 
    private Runnable mRunnable; 
    private View mView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mView = findViewById(R.id.some_view); 
     mHandler = new Handler(); 
     doSomethingInFiveSeconds(); 
    } 

    void doSomethingInFiveSeconds() { 
     mRunnable = new Runnable() { 
      @Override 
      public void run() { 
       Log.d(TAG, "run: Post Delayed!"); 

       if (mView != null) { 
        // Animate it… 
        mView.animate().alpha(0).setDuration(250); 
        // or just make it disappear 
        // mView.setVisibility(View.GONE); 
       } 
      } 
     }; 
     mHandler.postDelayed(mRunnable, 5000); 
    } 

    @Override 
    protected void onStop() { 
     if (mRunnable != null) { 
      mHandler.removeCallbacks(mRunnable); 
     } 

     super.onStop(); 
    } 
} 

また、それはあなたが本当に多くのコードを示していないので、あなたのビューが何をしているか伝えるのは難しいです。疑問がある場合は、ハンドラがメインスレッドでループしていることを確認してください(デフォルトではこれがデフォルトです)。私はあなたのmyelementが何であるか分からない。

+0

ありがとうコードです!正確な解決策ではありませんでしたが、それは私のためにいくつかの点を検証することによって私の最適な解決策に到達するのを助けました。私はまた、あなたの提案から非ヌル実行可能ファイルをチェックする 'mRunnable!= null'ブロックを追加しました。乾杯! – publicknowledge

0

myelementは、アクティビティの開始時にポップアップしてしばらくしてから消える必要があるレイアウト要素(この場合はLinearLayout)です。したがって、実行可能ファイルを使用します。

コールバックが最初に機能していなかった理由は、実行可能ファイルを参照できなかったためです。だから私は以下のことをしました。

ソリューション:

onCreateのは、グローバル変数を作成しました:(上記の質問に)

private Runnable myRunnable; 

を...とコード・ブロックを変更する:

myelement.postDelayed(myRunnable = new Runnable() { 
    public void run() { myelement.setVisibility(View.GONE); } 
}, 8000); 

だからonPause()onStop()の中に私がするとき:

public synchronized void onPause() {   
    if(myRunnable!=null){ 
     myelement.removeCallbacks(myRunnable); 
    } 
    super.onPause(); 
} 

これで、コールバックが正しく削除され、吃音の表示と消滅の要素がなくなりました。

関連する問題