java - 我的代码在 Android 中使用多线程吗?

标签 java android multithreading

我正在尝试为我的应用程序创建一个新线程,当然,当我调用它以防止 UI 线程崩溃时,它会执行所有必要的后台工作。我无法让它工作,并且对下一步应该做什么感到有点困惑。这是我的代码:

package com.alarm.mobilegame;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class startGames extends MainActivity {

int a = (int)Math.ceil(Math.random()*100);          
int b = (int)Math.ceil(Math.random()*100);
int c = (int)Math.ceil(Math.random()*100);          
int d = (int)Math.ceil(Math.random()*100);
int e = (int)Math.ceil(Math.random()*10);           
int f = (int)Math.ceil(Math.random()*10);
boolean A;
boolean B;
boolean C;

public void additionCalc() {

    TextView addquestion;
    TextView addquestion2;
    addquestion = (TextView) findViewById(R.id.textView1);
    addquestion2 = (TextView) findViewById(R.id.textView5);
    addquestion.setText("" + a + "+");
    addquestion2.setText("" + b);
}
public void substitutionCalc() {
    if (d > c)
    {
        while(d > c)
        d = (int)Math.ceil(Math.random()*100);              
    }
    TextView subquestion;
    TextView subquestion2;
    subquestion = (TextView) findViewById(R.id.textView2);
    subquestion2 = (TextView) findViewById(R.id.textView6);
    subquestion.setText("" + c + "-");
    subquestion2.setText("" + d);
}
public void multiplicationCalc() {
    if (e * f < 1)
    {
        while(e * f < 1)
        f = (int)Math.ceil(Math.random()*10);   
    }
    TextView mulquestion;
    TextView mulquestion2;
    mulquestion = (TextView) findViewById(R.id.textView3);
    mulquestion2 = (TextView) findViewById(R.id.textView7);
    mulquestion.setText("" + e + "x");
    mulquestion2.setText("" + f);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.start_game1);

    final Button buttonMathStart = (Button) findViewById(R.id.button1);
    buttonMathStart.setOnClickListener(new OnClickListener() {            
        public void onClick(View v) {
            additionCalc();
            substitutionCalc();
            multiplicationCalc();
        }});
}

void runInBackground() {
    new Thread(new Runnable() {

        @Override
        public void run() {
            checkResultsA();
            checkResultsB();
            checkResultsC();
        }

            public void checkResultsA() {
                EditText aText;

                aText = (EditText) findViewById(R.id.editText1);
                int c = Integer.parseInt(aText.toString());
                int d = a + b;
                if (d != c) {
                    A = false;
                }else{
                    A = true;
                    }
                }
                public void checkResultsB() {
                    EditText sText;
                    sText = (EditText) findViewById(R.id.editText1);
                    int c = Integer.parseInt(sText.toString());

                    int z = c - d;
                    if (d != c) {
                        B = false;
                    }
                    else{
                        B = true;
                        }
                    }
                public void checkResultsC() {
                    EditText mText;

                    mText = (EditText) findViewById(R.id.editText1);
                    int c = Integer.parseInt(mText.toString());

                    int d = a * b;
                    if (d != c) {

                        C = false;
                    }
                    else {
                        C = true;
                    }  

            //runInBackground();
        }
    });


    Button continueGame = (Button) findViewById(R.id.button2);
    continueGame.setOnClickListener(new OnClickListener(){
        public void onClick(View v) {
            runInBackground();

            if (A || B || C == false)
            {
                //
            }
            else
            {
                Intent myIntent = new Intent(startGames.this, secondGame.class);
                startGames.this.startActivity(myIntent);
            }

        }});
    }
}

最佳答案

您的runInBackground()创建了一个Thread,但没有start()它。该代码永远不会运行。

线程代码似乎正在访问 UI 元素。一般来说,您不应该在后台线程中触摸 UI。

onClick() 中调用 runInBackground() 时,您似乎假设线程结果已在下一个代码行中可用。事实并非如此。

我建议您看看AsyncTask,以使后台线程操作更容易。它还具有用于处理 UI 线程的便利助手。

此外,根据问题评论,您似乎一开始就不需要后台线程。根本问题是通过不运行代码来避免崩溃。要获得有关崩溃的帮助,请查看 logcat 中的异常堆栈跟踪。

关于java - 我的代码在 Android 中使用多线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21138198/

相关文章:

java - 从主类或启动监听器运行临时 Spring Boot 应用程序?

java - TableView 静态时不显示列

android - 从安卓到谷歌应用引擎

java - 如何取消从另一个线程发出http请求的线程

python - 使用 os 杀死 python 线程

java - Spring 的构造函数注入(inject)和数组

android - 我的 Android Studio 中的 Java 文件被毁坏了

android - 无法在 XML 文件中使用注释

linux - linux perf 对于测量多线程 C 程序的缓存未命中是否准确?

Java日历问题: why are these two Dates not equal?