0

私はAndroidに少し慣れていません。ユーザーが数値を入力してからフィボナッチ数列を計算し、1 秒間隔でシーケンス内の各要素を表示するアプリに取り組んでいます。しかし、for ループ内でスレッドを使用して表示しようとすると問題が発生します。配列リストから印刷しようとしましたが、カウンター変数 (j) でエラーが発生しました。はるかに単純なアプリでこれとまったく同じメソッドを実行してみましたが、配列リストはうまく機能しました。今回はなぜうまくいかないのかわかりません。これが単純な明らかなエラーであることを願っています。誰でも理由を教えてもらえますか? コードは以下に掲載されています。

public class MainActivity extends Activity {

// primary widgets
private EditText editText;
private TextView textView;
private Button button1;
Thread thread;
static ArrayList<Integer> fibList = new ArrayList<Integer>();

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    editText = (EditText) findViewById(R.id.editText1);
    textView = (TextView) findViewById(R.id.textView2);
    button1 = (Button) findViewById(R.id.button1);

    //Attempt to clear TextView
    textView.setText("");

    button1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            //Clear Textview
            String array = " "; 
            fibList.clear();
            textView.setText(array);

            final String input = editText.getText().toString();
            int number = Integer.parseInt(input);
            int tmp = 0;

            // confirm input
            if (number < 20) {
                Toast.makeText(getApplicationContext(),
                        "You entered: " + number, Toast.LENGTH_LONG).show();
                for (int i = 0; i <= number; i++) {
                    fibList.add(fib(i));

                    // sum even numbers
                    if (fib(i) % 2 == 0) {
                        tmp += fib(i);

                    }

                }
            } else {
                Toast.makeText(getApplicationContext(),
                        "Number is too Large: " + number, Toast.LENGTH_LONG)
                        .show();
            }

            Log.i("TEST", "ARRAY"+fibList);

            thread = new Thread(new Runnable(){

                  @Override
                  public void run(){

                    for(int j = 0; j < fibList.size(); j++){
                      runOnUiThread(new Runnable(){

                         @Override
                         public void run(){

                             //ERROR OCCURS HERE: Cannot refer to a non-final variable j 
                             //inside an inner class defined in a different method
                           textView.append(fibList.get(j).toString());

                           textView.append("");
                         }
                      });
                      try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } //wait one second
                    }
                  }

                });
                thread.start();
        }

    });
}

// run fibonacci sequence
public static int fib(int n) {
    if (n < 2) {
        return n;
    } else {
        return fib(n - 1) + fib(n - 2);
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

4

2 に答える 2

0

もっと深刻な問題があります。スレッドから texView を操作しようとしています。それは許可されていません。画面オブジェクトを操作できるのは GUI スレッドだけです。

AsyncTask を見てください。解決しようとしている問題に正確に対処するように設計されています。

http://developer.android.com/reference/android/os/AsyncTask.html

于 2013-05-10T18:41:39.477 に答える