Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
希望是Android线程中的一个简单错误_Android_Multithreading - Fatal编程技术网

希望是Android线程中的一个简单错误

希望是Android线程中的一个简单错误,android,multithreading,Android,Multithreading,我对安卓有点陌生。开发一个应用程序,让用户输入一个数字,然后计算斐波那契序列,然后每隔1秒显示序列中的每个元素。但是当我试图在for循环中使用线程显示时,我遇到了一个问题。我尝试从数组列表中打印,但它给我的计数器变量(j)带来了一个错误。我尝试在一个简单得多的应用程序中运行同样的方法,数组列表运行得很好。我不知道为什么这次不行。我希望这是一个简单的明显错误。谁能告诉我为什么?代码如下: public class MainActivity extends Activity { // primar

我对安卓有点陌生。开发一个应用程序,让用户输入一个数字,然后计算斐波那契序列,然后每隔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;
}
公共类MainActivity扩展活动{
//主要部件
私人编辑文本;
私有文本视图文本视图;
私人按钮1;
螺纹;
静态ArrayList fibList=新ArrayList();
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText=(editText)findViewById(R.id.editText1);
textView=(textView)findViewById(R.id.textView2);
button1=(按钮)findViewById(R.id.button1);
//尝试清除文本视图
textView.setText(“”);
button1.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//清除文本视图
字符串数组=”;
fibList.clear();
setText(数组);
最终字符串输入=editText.getText().toString();
int number=Integer.parseInt(输入);
int-tmp=0;
//确认输入
如果(数字<20){
Toast.makeText(getApplicationContext(),
您输入:“+number,Toast.LENGTH_LONG.show()”;

对于(int i=0;i解决问题的一个简单解决方法是以以下方式声明一个temp
final
变量:

       for(int j = 0; j < fibList.size(); j++){
             final int finalJ = 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(finalJ).toString());
                   textView.append("");
                }
           });
for(int j=0;j
您有一个更严重的问题。 您正试图从线程操纵texView。这是不允许的。只有GUI线程才能操纵屏幕对象,否则会发生不好的事情

看看AsyncTask,它的设计就是为了解决您试图解决的问题