2013-11-21 73 views
0

我想寫和應用程序,當按下按鈕時,將顯示從23到499所有素數。現在,我知道我有我的算法是正確的,所以這不是問題,因爲我可以在其他一些Java開發程序中使用Sopln來運行它。我相信這個問題存在於我之前從未使用過的線程中,或者可能是我使用了runnable。我也可以是一個整數到TextView的地方,但是,因爲我是新手,我不知道。任何幫助非常感謝,如果你需要更多的背景,我會很樂意提供。謝謝...Android新手:應用程序崩潰時運行while循環(線程?)

public class PrimeNumbers extends Activity implements OnClickListener { 

Button whatPrime, howManyPrime, resetPrime; 
TextView numPrime, ctPrime; 
int prime = 23, factor, ct = 0;; 
StringBuilder strBuPrime; 
String strPrime; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.primenumbers); 
    initialize(); 
    whatPrime.setOnClickListener(this); 
    howManyPrime.setOnClickListener(this); 
    resetPrime.setOnClickListener(this); 
}// end onCreate 

private void initialize() { 
    // TODO Auto-generated method stub 
    whatPrime = (Button) findViewById(R.id.bPrime); 
    howManyPrime = (Button) findViewById(R.id.bPrimeCount); 
    resetPrime = (Button) findViewById(R.id.bPrimeReset); 
    numPrime = (TextView) findViewById(R.id.tvPrimeNumbers); 
    ctPrime = (TextView) findViewById(R.id.tvPrimeNumbersCount); 
}// end initialize 

Runnable findPrimes = new Runnable() { 
    @Override 
    public void run() { 
     while (prime <= 499 && prime >= 23) { 
      factor = 3; 
      while (prime % factor != 0) // if true start testing 
             // other 
             // factors 
      { 
       while (factor <= (Math.sqrt(prime))) // testing 
                 // other 
                 // factors 
       { 
        if (prime % factor == 0) // factor found, leave 
               // while 
        { 
         factor = 2000; 
        } 
        factor++; 
       } 
       if (factor != 2001) // no factor found but left 
            // while, print 
            // prime, add 1 to counter 
       { 
        strPrime = Integer.toString(prime); 
        strBuPrime.append(strPrime + '\n'); 
       } 
       factor = 1; // leave while as 1 is a factor of 
          // everything 
      } 
      prime += 2; // test next prime 
     } 
     numPrime.post(new Runnable() { 
      @Override 
      public void run() { 
       numPrime.setText(strBuPrime); 
      } 
     }); 
    } 
}; 
Thread threadPrimes = new Thread(findPrimes); 

@Override 
public void onClick(View arg0) { 
    // TODO Auto-generated method stub 
    switch (arg0.getId()) { 
    case R.id.bPrime: 
     threadPrimes.start(); 
     break; 
    case R.id.bPrimeCount: 
     ctPrime.setText("There are " + ct 
       + " prime numbers from 23 to 499."); 
     break; 
    case R.id.bPrimeReset: 
     numPrime.setText(""); 
     ctPrime.setText(""); 
     break; 
    } 
}// end onClick 

}

+1

請發佈logcat – ashatte

+3

關於格式化的意見評論不是一個好主意。你可以在一個循環上面疊加一組註釋,解釋它的目的或功能,但是讓它們偏移並允許它們將括號放下來並不會對你的代碼有任何好處。 – ChiefTwoPencils

+0

「'S.o.pln'」,你真的需要縮寫嗎?我花了5秒鐘來弄清楚你在說什麼...... – Tonithy

回答

0

的logcat會有所幫助,但你可能與post(Runnable)矯枉過正的價值附加到TextView。嘗試使用StringBuilder連接所有內容並一次設置文本。 (或者至少較大的塊。)

相關問題