简单循环适用于Java但不适用于#34; Android"

时间:2014-10-17 18:12:53

标签: android loops

我遇到一个问题,即在Java中运行一个简单的循环就可以在Android中运行了。

我创建了一个textview并将其设置为仅用于测试运行。当我运行这个时,我会在框中显示一个数字,就是这样,它永远不会改变为另一个数字。

我尝试使用for循环,但我得到的只是标题栏然后黑屏然后崩溃。

Eclipse中没有错误,她确实运行,没有错误,只是没有数字更新。

如果你想知道第二个while循环,它有点像一个暂停,所以你可以看到数字看起来更慢,并且使用纯Java。

Just and FYI我在youtube上观看vid时已经学习了两个星期的Java。我已经创建了一些Android应用程序,这些应用程序很简单但只是无法在Android中循环到循环。

感谢新人的帮助。

public class MainActivity extends ActionBarActivity {
    TextView display;
    int counter;
    int min = 1;
    int max = 5;
    int counter2;

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


        display = (TextView) findViewById(R.id.textView1);



        while(counter < 10){
        Random r = new Random();
        int rn = r.nextInt(max - min + 1) + min;
        String rando = Integer.toString(rn);
        display.setText(rando);


        while(counter2  < 5000){
            counter2++;
            }
        counter++;
        }
    }


    @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;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

2 个答案:

答案 0 :(得分:1)

Android使用事件驱动的UI模型,包括lifecycle event方法,如onCreate(),onPause(),各种键/按钮方法等。 这些是完成工作并在几毫秒内返回所必需的。

要执行更长时间的运行任务 - 包括重复更新 - 您将不得不使用除主/ UI线程之外的线程,包含该线程的众多机制之一,或添加其他事件,例如通过Timer。 / p>

另请注意,您无法从UI线程以外的任何线程触摸UI,因此当您的后台方法决定要在UI中更改某些内容时,它必须将该实际更新操作推送到UI线程,一个机制,如runOnUiThread()或处理程序。

答案 1 :(得分:0)

这里只是做一个吐司,而不是设置文本视图,这样你就可以看到发生了什么,我改变了你的计数器,在每次更新后重置,所以下一个#有一个暂停..如果你为textview做的那样尝试在onCreate()因为你只能在创建后看到视图,这就是为什么你没有看到每次暂停的变化。

while(counter < 10){
        Random r = new Random();
        int rn = r.nextInt(max - min + 1) + min;
        String rando = Integer.toString(rn);
       Toast.makeText(this, rando, 1).show();
       //reset your counter to slow the next # down
       counter2=0;



        while(counter2  < 50){
            counter2++;
            }
       counter++;
        }

如果你需要在textview上打印它们,你需要在排队的runnable上运行它们。或者你可以做一个单独的线程但是没有一个单独的线程的单向:

 public class MainActivity extends ActionBarActivity {
    TextView display;
    int counter;

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


        display = (TextView) findViewById(R.id.textView1);


            handler = new Handler();
//this starts the runnable right away
          handler.postDelayed(updateTextRunnable, 0);
        }
    }

    private Runnable updateTextRunnable = new Runnable() {
        public void run() {
          doStuff();

        }
    };

    public void doStuff(){

            Random r = new Random();
            int rn = r.nextInt(max - min + 1) + min;
            String rando = Integer.toString(rn);
           display.setText(rando);


           //heres the pause, it runs every two seconds 
        if(counter<10)
           handler.postDelayed(updateTextRunnable, 2000);
        counter++;
    }

    }