thread.sleep突然停止了工作

时间:2018-03-21 10:21:42

标签: java android thread-sleep

我目前正在研究Android上的决赛项目。 该项目是关于SimonSays游戏: 在我的西蒙说游戏中有一个应用程序应该睡觉的部分 但确实如此,我认为这是因为我的老师添加了所有这些尝试并抓住了

功能,我该如何解决?

    package com.gabie212.simonsays;

import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Handler;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.RelativeLayout;
import android.widget.TextView;

import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;

public class GameActivity extends AppCompatActivity implements View.OnClickListener,View.OnLongClickListener {

    private int i = 0, pNum = 0, pIndex = 0,score;
    private Thread t = new Thread();
    private Thread bt = new Thread();
    private Button greenButton;
    private Button redButton;
    private Button blueButton;
    private Button yellowButton;
    private Button startButton;
    private TextView Score;
    private boolean startActivated = false;
    private MediaPlayer greenBeep;
    private MediaPlayer redBeep;
    private MediaPlayer blueBeep;
    private MediaPlayer yellowBeep;

    private ArrayList<Integer> userColors = new ArrayList<Integer>();
    // change backgroud
    final String imagefile = "savedImageLocation";//for background
    private ImageButton btPhoto;  // for background
    private android.support.constraint.ConstraintLayout background; // for background
    private int yellowish = Color.rgb(0, 191, 255);// for background
    private Handler handler = new Handler();

    final int SECOND_ACTIVITY = 10;

    // game manager
    private GameManger gm;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        setContentView(R.layout.activity_game);

        Score = (TextView) findViewById(R.id.ScoreNum);
        greenButton = (Button) findViewById(R.id.btnGreen);
        redButton = (Button) findViewById(R.id.btnRed);
        blueButton = (Button) findViewById(R.id.btnBlue);
        yellowButton = (Button) findViewById(R.id.btnYellow);
        startButton = (Button) findViewById(R.id.btnStart);
        greenButton.setOnClickListener(this);
        redButton.setOnClickListener(this);
        blueButton.setOnClickListener(this);
        yellowButton.setOnClickListener(this);
        startButton.setOnClickListener(this);
        greenBeep = MediaPlayer.create(this, R.raw.greenbeep);
        redBeep  = MediaPlayer.create(this, R.raw.redbeep);
        blueBeep =   MediaPlayer.create(this, R.raw.bluebeep);
        yellowBeep =  MediaPlayer.create(this, R.raw.yellowbeep);
        greenButton.setOnLongClickListener(this);
        redButton.setOnLongClickListener(this);
        blueButton.setOnClickListener(this);
        yellowButton.setOnClickListener(this);
     /*
        SharedPreferences sp = getSharedPreferences("score", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.clear();
        editor.apply();

     */


        // for change background
        btPhoto = (ImageButton) findViewById(R.id.btPhoto);
        btPhoto.setOnLongClickListener(this);
        background = (android.support.constraint.ConstraintLayout) findViewById(R.id.background);
    }

    public void start() {
        startActivated=true;
        gm = new GameManger(this);
        Score.setText("0");
        lightUp(0);
    }

    public void beepStop(){
        greenBeep.stop();
        redBeep.stop();
        blueBeep.stop();
        yellowBeep.stop();

    }


    public void lightUp(final int i) {

        android.os.Handler handler = new android.os.Handler();
        if (i < gm.getRandomColors().size())  //light up code
        {
            switch (gm.getRandomColors().get(i)) {
                case 1:
                    greenButton.setBackgroundResource(R.drawable.greenlightup);
                    greenBeep.start();
                    handler.postDelayed(new Runnable() {

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            greenButton.setBackgroundResource(R.drawable.green);
                            lightUp(i+1);
                        }
                    }, 500);


                    break;
                case 2:
                    redButton.setBackgroundResource(R.drawable.redlightup);
                    redBeep.start();
                    handler.postDelayed(new Runnable() {

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            redButton.setBackgroundResource(R.drawable.red);
                            lightUp(i+1);
                        }
                    }, 500);


                    break;
                case 3:
                    blueButton.setBackgroundResource(R.drawable.bluelightup);
                    blueBeep.start();
                    handler.postDelayed(new Runnable() {

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            blueButton.setBackgroundResource(R.drawable.blue);
                            lightUp(i+1);
                        }
                    }, 500);


                    break;
                case 4:
                    yellowButton.setBackgroundResource(R.drawable.yellowlightup);
                    yellowBeep.start();
                    handler.postDelayed(new Runnable() {

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            yellowButton.setBackgroundResource(R.drawable.yellow);
                            lightUp(i+1);
                        }
                    }, 500);


                    break;
            }

        }
        pIndex = 0;
    }


    @Override
    public void onClick(View v) {
        if (v.getId() == startButton.getId()) {
            start();
        } else {
            if (startActivated) {
                if (v.getId() == greenButton.getId()) {
                    greenBeep.start();
                    pNum = 1;
                }
                if (v.getId() == redButton.getId()) {
                    redBeep.start();
                    pNum = 2;
                }
                if (v.getId() == blueButton.getId()) {
                    blueBeep.start();
                    pNum = 3;
                }
                if (v.getId() == yellowButton.getId()) {
                    yellowBeep.start();
                    pNum = 4;

                }
                if (!gm.check(pNum, pIndex)) {
                    beepStop();
                    SharedPreferences sp = getSharedPreferences("score", Context.MODE_PRIVATE);
                    Intent i = null;
                    score = gm.getRandomColors().size()-1;
                    if(score > sp.getInt("scoreP3",0)) {
                         i = new Intent(GameActivity.this, InsertScoreActivity.class);
                        i.putExtra("score", gm.getRandomColors().size() - 1);
                        startActivity(i);
                    }
                    else {
                        i = new Intent(GameActivity.this, GameOverActivity.class);
                        i.putExtra("score", gm.getRandomColors().size() - 1);
                        startActivity(i);
                    }
                }
                pIndex++;
                if (pIndex == gm.getRandomColors().size()) {
                    Score.setText("" + gm.getRandomColors().size() + "");
                    gm.addColor();
                    //this is the sleep that doesn't work
                    try {                              
                        t.sleep(500);
                        // Do some stuff                 
                    } catch (Exception e) {
                        e.getLocalizedMessage();
                    }
                    //this is the sleep that doesn't work
                    lightUp(0);
                }
            }

        }

    }
    // for background
    public void getPhoto(View v)
    {
        //brings user to gallery to select image for background of screen
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Select Picture"),0);
    }
    //for background
    @Override
    public boolean onLongClick(View view)
    {
        AlertDialog.Builder info = new AlertDialog.Builder(this);
        info.setTitle("Remove Background Image?");
        info.setMessage("Are you sure you wish to revert to the default background?");
        info.setCancelable(true);
        info.setPositiveButton("Yes", new DialogInterface.OnClickListener()
        {
            public void onClick(DialogInterface dialog, int id)
            {   //erases current background image location

                try {
                    FileOutputStream fos = openFileOutput(imagefile, Context.MODE_PRIVATE);
                    OutputStreamWriter osw = new OutputStreamWriter(fos);
                    BufferedWriter writer = new BufferedWriter(osw);

                    writer.close();
                    osw.close();
                    fos.close();

                    background.setBackgroundColor(yellowish);
                }
                catch (Exception e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
        info.setNegativeButton("Cancel", new DialogInterface.OnClickListener()
        {
            public void onClick(DialogInterface dialog, int id)
            {
                dialog.cancel();
            }
        });

        info.show();

        return false;
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        if(requestCode == 0 && resultCode == RESULT_OK)
        {
            try
            {
                Uri selectedImage = data.getData();

                grantUriPermission("com.example.memorygame", selectedImage,
                        Intent.FLAG_GRANT_READ_URI_PERMISSION);

                InputStream imageStream;
                imageStream = getContentResolver().openInputStream(selectedImage);
                Bitmap bitmap = BitmapFactory.decodeStream(imageStream);
                Drawable image = new BitmapDrawable(getResources(), bitmap);
                background.setBackground(image);

                //saves location of background image
                try
                {

                    FileOutputStream fos = openFileOutput(imagefile, Context.MODE_PRIVATE);
                    OutputStreamWriter osw = new OutputStreamWriter(fos);
                    BufferedWriter writer = new BufferedWriter(osw);

                    String imageUri = selectedImage.toString();
                    writer.append(imageUri);

                    writer.close();
                    osw.close();
                    fos.close();

                }
                catch (Exception e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            catch (FileNotFoundException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }



        }
    }

}

所以这是我的代码,我会在thread.sleep上放两个注释,对我来说不起作用。 基本上我有这个功能,点亮一系列按钮(按一定顺序切换颜色), 然后我有一个接收用户输入的功能(用户按下的按钮和按什么顺序)。 我想通过睡眠做的是在颜色输入的结束(当用户完成按压东西)和点亮的开始(当按钮点亮/改变颜色时)之间稍微休息一下。 我认为问题来自于所有这些尝试和捕捉功能,或者他们被称为(对不起我是初学者)但是我不知道如何克服这个问题。

3 个答案:

答案 0 :(得分:0)

在android中,你可以使用Handler等待你想要的,这是一个2秒(2000毫秒)延迟的例子:

Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() {
         @Override 
         public void run() { 
              // this code will run after 2 seconds
         } 
    }, 2000); 

只需将此代码插入您需要等待/休眠的任何地方。

答案 1 :(得分:0)

你应该避免 Thread.sleep()。使用handler来执行UI相关操作。

new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
    @Override
    public void run() {
        //Do something here
    }
}, 5000);

如果您有时间,请浏览以下链接。这将给出处理程序和线程的概念。 Android, Handler is running in main thread or other thread?

答案 2 :(得分:0)

最好使用Handler代替Thread.sleep();

只需替换

 //this is the sleep that doesn't work
                    try {
                        t.sleep(500);
                        // Do some stuff
                    } catch (Exception e) {
                        e.getLocalizedMessage();
                    }
                    //this is the sleep that doesn't work

。通过

  Handler handler1=new Handler();
                    handler1.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            lightUp(0);
                        }
                    },500);