【问题标题】:New to Android: App Crashes When Running While Loop (Threading?)Android 新手:运行 While 循环时应用程序崩溃(线程?)
【发布时间】:2013-12-06 16:07:23
【问题描述】:

我正在尝试编写和应用程序,当按下按钮时,它将显示从 23 到 499 的所有素数。现在,我知道我的算法是正确的,所以这不是问题,因为我可以运行它在其他一些 Java 开发程序中使用 Sopln。我认为问题在于我使用了一个线程,因为我以前从未使用过线程,或者我使用了一个可运行的线程。我也可以将整数附加到 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

}

【问题讨论】:

  • 请发布logcat
  • 喜欢评论而不是格式不是一个好主意。您始终可以在循环上方堆叠一组 cmets,解释其目的或功能,但让它们偏移并允许它们将括号向下推对您的代码没有任何好处。
  • "S.o.pln",你真的需要缩写吗?我花了大约 5 秒钟才弄清楚你在说什么……
  • 如何将 logcat 放到这里,那是什么?

标签: java android while-loop append runnable


【解决方案1】:

你应该尝试使用 AsyncTask http://developer.android.com/reference/android/os/AsyncTask.html

我认为您的线程仍在 UI 线程池中运行并导致 UI 锁定。

如果您将 UI 锁定约 2-3 秒,Android 将终止您的线程。 AsyncTask 还允许您在可运行对象完成工作时显示状态栏或旋转环。

【讨论】:

    【解决方案2】:

    logcat 会有所帮助,但您可能过度使用 post(Runnable) 将值附加到您的 TextView。尝试使用StringBuilder 连接所有内容并一次性设置所有文本。 (或者至少在更大的块中。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多