我正在尝试在android中创建一个简单的wack-a-mole。我创建了一系列按钮。当用户点击"开始"我想为每个按钮启动一个线程。该线程将切换按钮处于打开和关闭状态。我在swing(java)中编写了应用程序,它运行良好。我在android中尝试相同,但它正在创建问题。请说明出了什么问题。我正在为每个按钮启动一个线程,但应用程序终止。如果我只为任何特定按钮启动一个线程,那么它可以正常工作。
编辑:即使在硬编码按钮线程后,它也会在点击时崩溃。 logcat中没有显示任何内容。 创建按钮:所有按钮都是初始化我能够点击它们并且它们的动作执行正常。用oncreate方法编写的代码。
int j=0;
for (int k = 0; k <ROWS; k++) {
TableRow row = new TableRow(this);
//inner loop:
for (int l = 0; l < COLS; l++) {
btn[j] = new Button(this);
TableRow.LayoutParams tr = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);
layout.setWeightSum(12.0f);
tr.setMargins(left, top, right, bottom);
btn[j].setLayoutParams(tr);
row.addView(btn[j]);
j++;
}
编辑:在开始的onclick()监听器(从上面创建的按钮的一些其他按钮)按钮上写的COde。如果我只启动一个线程应用程序工作,但如果我返回创建多个线程崩溃。这不是创建线程的正确方法吗?我认为ASYNCTASK在这里很有用,但欢迎提出意见。
start.setOnClickListener(new Button.OnClickListener() {
EditText timer = (EditText) findViewById(R.id.time);
// Called when user clicks the start button
public void onClick(View v) {
Log.i("thread started for ", btn[0]+"");
ButtonsThread bt2 = new ButtonsThread(btn[0]);
bt2.start();
ButtonsThread bt3 = new ButtonsThread(btn[1]);
bt3.start();
ButtonsThread bt4 = new ButtonsThread(btn[2]);
bt4.start();
ButtonsThread bt5 = new ButtonsThread(btn[3]);
bt5.start();
ButtonsThread bt6 = new ButtonsThread(btn[4]);
bt6.start();
}});
请说明为什么这个for循环会导致应用程序崩溃。
问题2:当我在oncreate()方法中创建按钮时,我想为它们附加一个监听器。 我创建了一个实现onClickListener()的类,并在所有按钮上附加了它的对象: //这是我现在纠正的错误代码。
for (int k = 1; k < 10; k++) {
TableRow row = new TableRow(this);
//innerloop:
for (int l = 1,j=0; l < 4; j++,l++) {
btn[j] = new Button(this);
btn[j].setEnabled(true);
//listner class
Score scoreListener = new Score();
btn[j].setOnClickListener(scoreListener);
row.addView(btn[j]);
如果单击任何按钮,这也会导致应用程序失败。 这是Thread类的代码:
class ButtonsThread extends Thread {
Button moleButton;
ButtonsThread(Button b) {
this.moleButton = b;
Log.i(TAG,"buttone thread created"+b);
}
public void run() {
while (timerInLong > 0) {
Log.i("while","while loop ");
try {
MapLocation.this.runOnUiThread(new Runnable() {
@Override
public void run() {
moleButton.setEnabled(true);
moleButton.setText(":-)");
}
});
moleButton.runOnUiThread(new Runnable() {
@Override
public void run() {
moleButton.setEnabled(true);
moleButton.setText(":-)");
moleButton.setBackgroundColor(Color.BLUE);
}
});
Thread.sleep(1000);
moleButton.post(new Runnable() {
@Override
public void run() {
moleButton.setEnabled(false);
moleButton.setText(":-(");
moleButton.setBackgroundColor(Color.RED);
}
});
Thread.sleep(1000);
答案 0 :(得分:1)
您对阵列中有多少按钮的处理方式并不一致:
btn[0]
。btn[1]
,btn[2]
,btn[3]
,btn[4]
。btn[0]
,btn[1]
,btn[2]
,但您反复重新初始化这些元素,每个元素有9个不同的按钮。很难理解这一点,但似乎你要离开btn[3]
和btn[4]
未初始化,当你开始使用它们时可能会导致NullPointerException
。 (你忽略了说你得到了什么例外......)
小心你的循环条件。除非你想特别对待数组的第一个元素,否则你不应该写一个形式的循环:
for (int k = 1; k < N; k++)
更常见的是你想从0开始:
for (int k = 0; k < N; k++)
或某些用途,从1开始并使用<=
作为边界条件:
for (int k = 1; k <= N; k++)
我无法回答你的问题2,因为你说你发布了得分听众代码而你没有。