Android新手:在循环运行时应用程序崩溃(线程化?)

时间:2013-11-21 22:56:18

标签: java android while-loop append runnable

我正在尝试编写和应用程序,当按下按钮时,将显示从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

}

2 个答案:

答案 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完成工作时显示状态栏或旋转环。