线程冻结了Android应用程序上的活动

苏安尼尔

我试图在我的应用程序上使用线程来延迟该线程而不冻结活动。问题是即使我在线程上具有Thread.sleep(),活动也被冻结。我想做的是一个像Simon所说的游戏,我想在不冻结活动的情况下突出显示按钮2秒钟,但是它被冻结了。该线程称为NuevoColor,我在onCreate方法的末尾启动它。我将代码粘贴在这里,谢谢。

package com.example.simondice;

import java.util.ArrayList;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;

public class Jugar extends Activity {

public Button boton1Rojo;
public Button boton2Azul;
public Button boton3Verde;
public Button boton4Amarillo;

public ArrayList<Integer> arrayJuego; //se guarda la secuencia del juego
public ArrayList<Integer> arrayJugador; //se guarda la secuencia introducida por el jugador

@Override public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.jugar);
    boton1Rojo = (Button) findViewById(R.id.button1);
    boton2Azul = (Button) findViewById(R.id.button2);
    boton3Verde = (Button) findViewById(R.id.button3);
    boton4Amarillo = (Button) findViewById(R.id.button4);

    //cambiamos el color de los botones
    boton1Rojo.setBackgroundColor(Color.rgb(127, 0, 0));
    boton2Azul.setBackgroundColor(Color.rgb(0, 0, 127));
    boton3Verde.setBackgroundColor(Color.rgb(0, 127, 0));
    boton4Amarillo.setBackgroundColor(Color.rgb(127, 127, 0));

    //botones a disable al iniciar
    boton1Rojo.setEnabled(false);
    boton2Azul.setEnabled(false);
    boton3Verde.setEnabled(false);
    boton4Amarillo.setEnabled(false);

    //iniciamos el juego
    NuevoColor juego = new NuevoColor();
    juego.start();
}


// Crea un nuevo color para el juego
public class NuevoColor extends Thread {

    @Override public void run() {
        runOnUiThread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                arrayJuego = new ArrayList<Integer>();

                try {
                    int rand = 0;

                    rand = (int) Math.floor(Math.random()*4+1);

                    if(rand==1) { //iluminamos los botones y los añadimos al array
                        boton1Rojo.setBackgroundColor(Color.rgb(255, 0, 0));
                        arrayJuego.add(1);
                        Thread.sleep(2000);
                        boton1Rojo.setBackgroundColor(Color.rgb(127, 0, 0));
                    } else if(rand==2) {
                        boton2Azul.setBackgroundColor(Color.rgb(0, 0, 255));
                        arrayJuego.add(2);
                        Thread.sleep(2000);
                        boton2Azul.setBackgroundColor(Color.rgb(0, 0, 127));
                    } else if(rand==3) {
                        boton3Verde.setBackgroundColor(Color.rgb(0, 255, 0));
                        arrayJuego.add(3);
                        Thread.sleep(2000);
                        boton3Verde.setBackgroundColor(Color.rgb(0, 127, 0));
                    } else {
                        boton4Amarillo.setBackgroundColor(Color.rgb(255, 255, 0));
                        arrayJuego.add(4);
                        Thread.sleep(2000);
                        boton4Amarillo.setBackgroundColor(Color.rgb(127, 127, 0));
                    }
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }

        });
    }
}

}

编辑:谢谢大家的答案,现在我更好地了解runOnUiThread for()了。这是该类在进行一些更改后工作的方法,以防万一有人发现它有用:

    public class NuevoColor extends Thread {

    @Override public void run() {
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        runOnUiThread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                cambiarColor();
            }

        });

        try {
            Thread.sleep(2000);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        runOnUiThread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                colorOriginal();
            }

        });
    }
}
斯坦

只需移动“ Thread.sleep(2000);”即可。到在UI线程上运行的Runnable之外。我看到您无论如何都要休眠线程。所以像这样:

public class NuevoColor extends Thread {

    @Override public void run() {
        Thread.sleep(2000);
        runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    // ...
                }

            });
    }
}

在NuevoColor的run()内部运行的所有操作都是后台工作,并且应该在那里休眠,因为您希望暂停后台线程,而不是整个使用接口。

当然,您在runOnUiThread()上投放的任何可运行的Runnable都将在UI线程上运行,因此它将冻结整个用户界面,直到完成。因此那里没有繁重的工作,也没有睡觉。

通常,这样想:您想做的任何事情,都在后台线程中做。任何更新UI的内容(例如setBackgroundColor()等),都应在UI线程上运行。在您的情况下,按照我的指示移动Thread.sleep(2000)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在pygtk应用程序上使用多线程以避免GUI冻结

来自分类Dev

在pygtk应用程序上使用多线程以避免GUI冻结

来自分类Dev

块冻结了我的应用程序

来自分类Dev

块冻结了我的应用程序

来自分类Dev

如何在具有多个活动的Android应用程序上使用Pusher?

来自分类Dev

在Spring Data应用程序上累积的MongoCleaner线程

来自分类Dev

在退出应用程序上安全退出Qt线程

来自分类Dev

在Spring Data应用程序上累积的MongoCleaner线程

来自分类Dev

RxJava onNext中的领域交易冻结了应用程序

来自分类Dev

ParseInstaller.getCurrentInstallation()。saveInBackground()冻结了我的应用程序

来自分类Dev

RxJava onNext中的领域交易冻结了应用程序

来自分类Dev

Android:在Android应用程序上使用图像

来自分类Dev

如何在Android应用程序上使用JSON解析的活动之间传递字符串?

来自分类Dev

在应用程序上禁用Keyguard调用会冻结电话

来自分类Dev

Surface在Android应用程序上无效

来自分类Dev

相关Android应用程序上的GCM BroacastReceiver处理

来自分类Dev

从Unity Game在Android应用程序上共享图像

来自分类Dev

xxhdpi Android javafxports应用程序上的动画“重影”

来自分类Dev

HttpPost在Android崩溃的应用程序上

来自分类Dev

Google Map在Android应用程序上崩溃

来自分类Dev

如何在Android应用程序上启用MSAA

来自分类Dev

安装应用程序上的Android getLocation为0.0

来自分类Dev

Android应用程序上的多个传感器

来自分类Dev

在多线程应用程序上创建后,某些线程无法执行

来自分类Dev

Android N 上的 SimpleDateFormat 冻结应用程序

来自分类Dev

应用程序活动期间,应用程序挂断或出现“不在FX应用程序线程上”

来自分类Dev

蓝牙文件传输应用程序上的AcceptThread不返回到活动

来自分类Dev

在我的基本计算器应用程序上的主要活动中出现错误

来自分类Dev

iOS应用程序上的电报

Related 相关文章

  1. 1

    在pygtk应用程序上使用多线程以避免GUI冻结

  2. 2

    在pygtk应用程序上使用多线程以避免GUI冻结

  3. 3

    块冻结了我的应用程序

  4. 4

    块冻结了我的应用程序

  5. 5

    如何在具有多个活动的Android应用程序上使用Pusher?

  6. 6

    在Spring Data应用程序上累积的MongoCleaner线程

  7. 7

    在退出应用程序上安全退出Qt线程

  8. 8

    在Spring Data应用程序上累积的MongoCleaner线程

  9. 9

    RxJava onNext中的领域交易冻结了应用程序

  10. 10

    ParseInstaller.getCurrentInstallation()。saveInBackground()冻结了我的应用程序

  11. 11

    RxJava onNext中的领域交易冻结了应用程序

  12. 12

    Android:在Android应用程序上使用图像

  13. 13

    如何在Android应用程序上使用JSON解析的活动之间传递字符串?

  14. 14

    在应用程序上禁用Keyguard调用会冻结电话

  15. 15

    Surface在Android应用程序上无效

  16. 16

    相关Android应用程序上的GCM BroacastReceiver处理

  17. 17

    从Unity Game在Android应用程序上共享图像

  18. 18

    xxhdpi Android javafxports应用程序上的动画“重影”

  19. 19

    HttpPost在Android崩溃的应用程序上

  20. 20

    Google Map在Android应用程序上崩溃

  21. 21

    如何在Android应用程序上启用MSAA

  22. 22

    安装应用程序上的Android getLocation为0.0

  23. 23

    Android应用程序上的多个传感器

  24. 24

    在多线程应用程序上创建后,某些线程无法执行

  25. 25

    Android N 上的 SimpleDateFormat 冻结应用程序

  26. 26

    应用程序活动期间,应用程序挂断或出现“不在FX应用程序线程上”

  27. 27

    蓝牙文件传输应用程序上的AcceptThread不返回到活动

  28. 28

    在我的基本计算器应用程序上的主要活动中出现错误

  29. 29

    iOS应用程序上的电报

热门标签

归档