我正在尝试编写和应用程序,当按下按钮时,将显示从23到499的所有素数。现在,我知道我的算法正确,所以这不是问题,因为我可以运行它在其他一些Java开发程序中使用Sopln。我相信的问题在于我使用了一个线程,因为我之前从未使用过一个线程,或者我可能使用了一个runnable。我也可以在我向TextView附加一个整数的地方,但是,因为我是新手,我不知道。非常感谢任何帮助,如果您需要更多上下文,我将很乐意提供。感谢...
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
}
答案 0 :(得分:0)
logcat会有所帮助,但您可能会使用post(Runnable)
对其进行过度操作,以便将值附加到TextView
。尝试使用StringBuilder
连接所有内容并立即设置所有文本。 (或者至少在较大的块中。)
答案 1 :(得分:0)
您应该尝试使用AsyncTask http://developer.android.com/reference/android/os/AsyncTask.html
我认为你的脚步仍然在UI线程池中运行并导致UI锁定。
如果您锁定用户界面约2-3秒,Android将终止您的线程。 AsyncTask还允许您在runnable完成工作时显示状态栏或旋转环。