无法在我的应用程序中启动多个线程

时间:2014-12-26 02:48:00

标签: android multithreading onclicklistener

我正在尝试在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);

1 个答案:

答案 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,因为你说你发布了得分听众代码而你没有。