[英]thread.sleep has suddenly stopped working
I am currently working on my finals project on android. 我目前正在Android上的Finals项目中工作。 the project is about a SimonSays game: in my Simon Says game a have a section where the application is supposed to sleep but it does , i think its because my teacher added all of these try and catch 该项目是关于SimonSays游戏的:在我的Simon Says游戏中,有一个部分应该让应用程序进入睡眠状态,但确实如此,我认为这是因为我的老师添加了所有这些try and catch
functions, how do i fix it? 功能,我该如何解决?
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();
}
}
}
}
so this is my code and the i will put two notes on the thread.sleep that doesn't work for me. 所以这是我的代码,我将在thread.sleep上放两个注释,这对我不起作用。 basically i have this function that lights up a series of buttons (switches their color in a certain order) , then i have a function which receives the user input ( what buttons the user pressed and in what order). 基本上,我具有此功能,该功能可以点亮一系列按钮(按特定顺序切换其颜色),然后具有接收用户输入(用户按下了哪些按钮以及按什么顺序)的功能。 what i want to do by that sleep is to put a little break between the end of the color input(when the user finishes to press stuff), and the beginning of the light up ( when the buttons lightup/change their color). 我想通过睡眠来做的是在颜色输入的结束(当用户完成按东西时)和点灯的开始(当按钮点灯/更改其颜色)之间稍作休息。 i think the problem comes with all of the these try and catch functions or however they're called (sorry i am a beginner) however i don't know hwo to overcome this. 我认为问题出在所有这些try and catch函数中,或者它们被称为(对不起,我是一个初学者),但是我不知道该如何克服这个问题。
In android, you can use Handler
to wait for as much as you want, here's an example of 2 seconds (2000 milliseconds) delay: 在android中,您可以使用Handler
来等待尽可能多的时间,这是2秒(2000毫秒)延迟的示例:
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
// this code will run after 2 seconds
}
}, 2000);
Just insert this code anywhere you need to wait/sleep your thread. 只需在需要等待/休眠线程的任何地方插入此代码。
You should avoid Thread.sleep() . 您应该避免Thread.sleep() 。 Use handler for doing UI related operation. 使用处理程序执行与UI相关的操作。
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
//Do something here
}
}, 5000);
If you get some time please go through the below link. 如果您有时间,请通过以下链接。 This will give an idea of handler and thread. 这将给出处理程序和线程的概念。 Android, Handler is running in main thread or other thread? Android,Handler是在主线程还是其他线程中运行?
It's better to use Handler instead to Thread.sleep(); 最好使用Handler代替Thread.sleep();
Just Replace this 只要替换这个
//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
With 用
Handler handler1=new Handler();
handler1.postDelayed(new Runnable() {
@Override
public void run() {
lightUp(0);
}
},500);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.