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