2012-11-04 60 views
2
public class TestingActivity extends Activity implements View.OnClickListener 
{ 
ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(1); 

ScheduledFuture now = null; 
public void onCreate(Bundle savedInstanceState) 
{ 
    //oncreate 
} 
public void rollthedice() 
{ 
//rollthedice 
} 


public void onClick(View view) 
{ 

    Runnable runner = new Runnable() 
    { 
     public void run() 
     { 
      rollthedice(); 
     } 
    }; 


    if(view.equals(continuous)) 
    { 
    if(now == null) 
     now = scheduler.scheduleAtFixedRate(runner, 0, 250, TimeUnit.MILLISECONDS); 
    else 
     return; 
    } 
    if(view.equals(stop)) 
    { 
     if(now != null) 
     { 
      now.cancel(true); 
      now = null; 
     } 

     else 
      return; 
    } 
    if(view.equals(roll)) 
     rollthedice(); 
    if(view.equals(exit)) 
     System.exit(0); 
} 

我把它用在一個Java應用程序,它工作得很好,我把它改成Android項目,它不工作,我想連續按鈕,連續運行rollthedice()和停止按鈕來停止它,然後連續啓動再次,停止來回當我按下連續按鈕時,爲什麼不會持續運行?

+0

您是否嘗試過調試代碼?我不認爲你應該在這裏使用equals(),簡單的==應該足夠了 – marcinj

+0

我相當肯定你會發現問題,如果你添加一些日誌到你的代碼和/或與調試器一步。 – forgemo

+0

好吧我改了==,所以會發生什麼是我打滾,它執行rollthedice()一次罰款,如果我打了連續按鈕,它似乎什麼都不做,但如果我點擊滾動按鈕,它跳過一個滾動計數,對於執行rollthedice()的次數,所以連續只執行一次rollthedice(),並且執行的次數不會在gui上更新,即使它一次執行也是如此?我想連續運行rollthedice()每秒4次,直到按下停止按鈕,一次連續運行rollthedice()不能再次完成,除非停止並再次連續運行 – JRowan

回答

1

你確定執行了onCLick嗎? 你叫

continuous.setOnClickListener(this); 
stop.setOnClickListener(this); 

等?

+0

是的,我做到了 – JRowan

+0

你可以嘗試在onClick中打印視圖的類名嗎?另外,請嘗試使用==代替equal()。應該是相同的,但你永遠不知道 – thedayofcondor

+0

我不明白 – JRowan

1

因爲你需要用一個標誌它添加一些while循環,試試這個:

public void run() 
{ 
while (runningFlag){ 
//do something here 
} 
} 

在您需要將標誌設置爲true,然後啓動線程開始,當你希望它停止將標誌設置爲假。

+0

我應該改變runnable? – JRowan

1

您可以有一個while循環並將條件設置爲true來停止它(因爲!)。您還應該高度考慮在單獨的線程中進行滾動。如果你這樣做,你可能會或可能不需要處理程序。

boolean mPaused = false; 

while(!mPaused) { 
    doSomething(); 
} 

//to stop it set mPaused = true 
//to resume call the method again 

處理器

//called by 
Message msg0 = new Message(); 
msg0.obj = "someting"; 
handler.sendMessage(msg0); 

private Handler handler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     if (msg.obj.equals("something")) { 
      doSomething(); 
     } 
    } 
};