【问题标题】:App crashes after just one iteration. It didn't run at all without a runnable. And now it crashes after the first iteration仅一次迭代后应用程序崩溃。没有可运行文件,它根本无法运行。现在它在第一次迭代后崩溃了
【发布时间】:2016-07-24 14:38:38
【问题描述】:
 package com.example.chirag.example;

 import android.support.v7.app.AppCompatActivity;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.Button;
 import android.widget.TextView;

 import java.util.Random;


 public class MainActivity extends AppCompatActivity {
TextView TV;
Button upbutton;
Button downbutton;
TextView score;
String n1;
int bool=0;
int a;
int b;
int sc=0;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView TV = (TextView)findViewById(R.id.TV);
    TextView score = (TextView)findViewById(R.id.score);
    Button upbutton = (Button) findViewById(R.id.upbutton);
    Button downbutton = (Button) findViewById(R.id.downbutton);
    Button start = (Button) findViewById(R.id.start);
    n1 = generate();
    TV.setText(n1);
    start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            start();
        }
    });
}
String generate()
{
    TextView TV = (TextView)findViewById(R.id.TV);
    int n = new Random().nextInt(20);
    String s = String.valueOf(n);
    return s;
}
void start() {
    Runnable  myRunnable = new Runnable() {
        @Override
        public void run()
        {while (bool == 0) {
            final TextView TV = (TextView) findViewById(R.id.TV);
            final TextView score = (TextView) findViewById(R.id.score);
            Button upbutton = (Button) findViewById(R.id.upbutton);
            Button downbutton = (Button) findViewById(R.id.downbutton);
            Button start = (Button) findViewById(R.id.start);
            String n2 = generate();
            TV.setText(n2);

            a = Integer.valueOf(n1.toString());
            b = Integer.valueOf(n2.toString());
            if (a > b) {
                downbutton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        String n3 = generate();
                        TV.setText(n3);
                        a = b;
                        b = Integer.valueOf(n3.toString());
                        score.setText("Score" + (sc + 1));
                    }
                });
                upbutton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        TV.setText("Game Over");
                        bool = 1;
                    }
                });
            } else {
                upbutton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        String n3 = generate();
                        TV.setText(n3);
                        a = b;
                        b = Integer.valueOf(n3.toString());
                        score.setText("Score" + (sc + 1));
                    }
                });
                downbutton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        TV.setText("Game Over");
                        bool = 1;
                    }
                });
            }
        }

        }
    };


    Thread myThread = new Thread(myRunnable);
    myThread.start();

}

}

我已将代码放入可运行文件中。逻辑似乎是正确的,但它不起作用。 generate 方法创建一个新号码并将其显示在“电视”中。单击开始时,会生成一个新数字,并将第二个数字与第一个数字进行比较。如果按下正确的按钮(向上或向下),则分数增加并继续该过程。如果点击了错误的按钮,则“游戏结束”

【问题讨论】:

  • 请发布 logact 并向我们展示应用程序崩溃的位置。
  • 嘿。请问可以给我你的email id吗?我很想澄清一些疑问!

标签: java android


【解决方案1】:

您不能从另一个线程触摸 UI。 Android 中的所有 UI 任务都应该在主线程中执行,也称为 UI 线程。 此行(例如)试图从非主线程的run() 命令内部影响ui:

 TV.setText(n2);

有关如何与 UI 线程通信的信息,请参阅this tutorial

【讨论】:

  • 嘿。循环需要一个可运行对象才能正确执行。并且 UI 任务不能在一个线程中更新。如果我的程序要求我循环更新我的任务怎么办?
  • 您需要获取主循环器的实例并通过该实例更新您的 UI 或使用 runOnUiThread 方法。看这里stackoverflow.com/a/13974916/2031068
  • 我用处理程序替换了可运行线程中的每个任务。现在,每次我点击开始,它都会崩溃! :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多