我正在尝试为我的应用程序创建一个新线程,当然,当我调用它以防止 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/