2017-10-28 148 views
1

我是Android新手......我開發了一個應用程序,通過單擊按鈕來轉換圖像,並添加Handler Runnable以自動獲取圖像轉換(也可以在未按下按鈕時),延遲時間爲5000ms。但我必須在此時按下按鈕停止處理程序,因爲某些原因我無法執行此操作。如何停止postnlay中的Runnable Handler

public class MainActivity extends AppCompatActivity { 

    private Integer images[]={R.drawable.pic1, R.drawable.pic21, .... 
    public int currImage=0; 
    public int ThreadCnt = 0; 
    public boolean backInt=true,forwardInc=false, ThreadInc=true; 
... 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
... 
    initializeImageSwitcher(); 
    setInitialImage(); 
    setImageRotateListener(); 

    final Handler handler = new Handler(); 

      final Runnable run = new Runnable() { 
       @Override 
      public void run() { 

    //forwardInc is a Boolean indicating that click button occurred 
       if(forwardInc){ 
    //and in this case (of forwardInc=true) I want to stop runnable for 5sec 
        handler.removeCallbacks(this); 
        handler.postDelayed(this, 5000); 
        forwardInc=false; 
        setInitialImage(); 
        setImageRotateListener(); 
        currImage++; 
        ThreadCnt++; 
} 
      handler.postDelayed(this, 5000); 

    } 
    }; 
    handler.post(run); 

,這是該按鈕的代碼單擊

public void setImageRotateListener() { 
     final Button rotatebutton=(Button) findViewById(R.id.btnRotateImage); 
     rotatebutton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       currImage++; 
//forwardInc indicating that click button occurred 
       forwardInc=true; 
       ... 
       setCurrentImage(); 
    ... 
+0

呼叫'handler.removeCallbacks(運行)'取消那個'Runnable'。 – CommonsWare

+0

但我已經將它添加到run()方法中的if語句中。 handler.removeCallbacks(本); –

+0

@CommonsWare,但我已經將它添加到run()方法中的if語句中。 'handler.removeCallbacks(本);' –

回答

0

它仍然是不清楚你想要做什麼。但據我瞭解,請嘗試以下內容:

首先,使RunnableHandler全局在課堂內。可運行

public class MainActivity extends AppCompatActivity{ 
    private Handler handler = new Handler(); 
    private Runnable runnable = new Runnable(){ 
     public void run(){/**/} 
    } 
    //other declarations. 
    //methods 
} 

內運行方法:

public void run(){ 
    setInitialImage(); //probably set next image 
    currImage++; 
    ThreadCnt++; 
    handler.postDelayed(this, 5000) 
} 

現在裏面的onClick:

public void onClick(View view){ 
    handler.removeCallbacks(this); 
    handler.postDelayed(this, 5000); 
    //no idea why you are using other code here. 
} 

而且裏面的onCreate:

//other lines 
setImageRotateListener(); 
handler.post(runnable); 
+0

太棒了!您的解決方案解決了問題。你能解釋一下爲什麼'Runnable'和'Handler' Global是必不可少的,爲什麼'handler.post(runnable);'應該在onCreate裏面。謝謝。 –

+0

他們是全球化的,所以他們可以從該類中的任何方法訪問。 'handler.post(runnable);'啓動'runnable',所以要在activity開始時啓動它,它在'onCreate'內。 –