我有调用该错误的问题,我已经在主题中写了。我有3个类,其中一个是“主要”类,应该根据类Level中的字符串在屏幕上添加路面对象的类Pavement。我为将方法保留在Pavement类中并摆脱该错误做了什么。我在这里应用资料来源:
开始:
package com.example.simplerpgdorid;
import java.util.ArrayList;
import java.util.Iterator;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Paint.Style;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.WindowManager;
public class Start extends Activity implements OnTouchListener{
Canvas c;
OurView ov;
Bitmap champ, grass, arrows;
static Bitmap pave;
Character character;
Pavement pavement;
float x, y;
char direction = 'x';
int topArrow[] = {370, 100, 430, 122};
int bottomArrow[] = {370, 195, 430, 223};
int leftArrow[] = {342, 130, 366, 184};
int rightArrow[] = {434, 130, 464, 184};
int lvlx;
public static int gowno = 0;
static Iterator<Locatable> itrLocatables;
static ArrayList<Pavement> pavements = new ArrayList<Pavement>();
static ArrayList<Locatable> locatables = new ArrayList<Locatable>();
static ArrayList<Locatable> locatablesArray = new ArrayList<Locatable>();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
Level lll = new Level();
ov = new OurView(this);
lvlx = 1;
champ = BitmapFactory.decodeResource(getResources(), R.drawable.s1);
grass = BitmapFactory.decodeResource(getResources(), R.drawable.grass);
arrows = BitmapFactory.decodeResource(getResources(), R.drawable.arrows);
pave = BitmapFactory.decodeResource(getResources(), R.drawable.pavement);
character = new Character(ov, champ);
pavement = new Pavement(3, 3, pave);
pavement.setBitmap(pave);
initLocatables();
initLocatables2();
ov.setOnTouchListener(this);
setContentView(ov);
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
ov.pause();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
ov.resume();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
switch(event.getAction()){
case MotionEvent.ACTION_MOVE:
x = event.getX();
y = event.getY();
if(x > topArrow[0] && x < topArrow[2] && y > topArrow[1] && y < topArrow[3]){
direction = 'w';
}
else if(x > bottomArrow[0] && x < bottomArrow[2] && y > bottomArrow[1] && y < bottomArrow[3]){
direction = 's';
}
else if(x > leftArrow[0] && x < leftArrow[2] && y > leftArrow[1] && y < leftArrow[3]){
direction = 'a';
}
else if(x > rightArrow[0] && x < rightArrow[2] && y > rightArrow[1] && y < rightArrow[3]){
direction = 'd';
}else{
direction = 'x';
}
break;
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
public class OurView extends SurfaceView implements Runnable{
Thread thread = null;
boolean isGoing = false, spriteLoaded = false;
SurfaceHolder holder;
public OurView(Context context) {
super(context);
// TODO Auto-generated constructor stub
holder = getHolder();
}
@Override
public void run() {
// TODO Auto-generated method stub
while(isGoing){
if(!holder.getSurface().isValid()){
continue;
}
for(Locatable l : locatables)
{
l.isDeInited();
l.isInited();
}
pavement.deInit(Level.lvl[lvlx]);
pavement.init(Level.lvl[lvlx]);
c = holder.lockCanvas();
draw(c);
holder.unlockCanvasAndPost(c);
}
}
public void pause(){
isGoing = false;
while(true){
try{
thread.join();
}catch(InterruptedException e){
e.printStackTrace();
}
break;
}
thread = null;
}
public void resume(){
isGoing = true;
thread = new Thread(this);
thread.start();
}
public void draw(Canvas canvas){
canvas.drawARGB(255, 100, 100, 100);
canvas.drawBitmap(grass, 0, 0, null);
Paint paint = new Paint();
paint.setColor(Color.GRAY);
paint.setStyle(Style.FILL);
paint.setTextSize(15);
Rect UI = new Rect();
UI.set(320, 0, getWidth(), getHeight());
canvas.drawRect(UI, paint);
canvas.drawBitmap(arrows, getWidth() - arrows.getWidth() - 16, getHeight()/2 - arrows.getHeight()/2, null);
initLocatables();
initLocatables2();
for (@SuppressWarnings("rawtypes")Iterator i = locatablesArray.listIterator(); i.hasNext();)
{
Locatable l = (Locatable) i.next();
l.draw(canvas);
}
locatablesArray.clear();
pavement.draw(canvas);
//Debug
character.draw(canvas, direction);
paint.setColor(Color.RED);
canvas.drawText("x = " + x + " y = " + y + " " + gowno , 20, 20, paint);
canvas.drawCircle(x, y, 5, paint);
}
}
public void initLocatables()
{
locatables.add(pavement);
}
public void initLocatables2()
{
locatablesArray.addAll(pavements);
itrLocatables = locatablesArray.listIterator();
}
}
路面:
package com.example.simplerpgdorid;
import com.example.simplerpgdorid.Start.OurView;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.util.Log;
public class Pavement extends Activity implements Locatable{
OurView v;
Bitmap b = null;
int x, y, size;
boolean isInited = false, isDeInited;
public Pavement(int x, int y, Bitmap bit){
this.x = x * 32;
this.y = y * 32;
this.b = bit;
}
public void init(String[] xlevel){
Start.pavements.add(new Pavement(32, 32, getbitmap()));
Start.pavements.add(new Pavement(52, 52, getbitmap()));
Start.pavements.add(new Pavement(22 , 66, getbitmap()));
if(!isInited){
for(int z = 0; y < Level.lvl.length; y++){
for(int s = 0; x < Level.lvl.length; x++){
if(xlevel[z].charAt(s) == 'p'){
Start.pavements.add(new Pavement(z, s, getbitmap()));
}
Start.gowno ++;
}
}
}
isInited = true;
}
public void deInit(String[] xlevel)
{
if(!isDeInited)
for(int y = 0; y < Start.pavements.size(); y++)
{
Start.pavements.get(y).x = -100;
Start.pavements.get(y).y = -100;
}
isDeInited = true;
}
@Override
public void draw(Canvas canvas) {
// TODO Auto-generated method stub
canvas.drawBitmap(getbitmap(), x, y, null);
}
@Override
public void isInited() {
// TODO Auto-generated method stub
isInited = false;
}
@Override
public void isDeInited() {
// TODO Auto-generated method stub
isDeInited = false;
}
@Override
public Bitmap getbitmap() {
// TODO Auto-generated method stub
Bitmap bmp = null;
bmp = b;
return bmp;
}
@Override
public void setBitmap(Bitmap bmp) {
// TODO Auto-generated method stub
this.b = bmp;
}
}
和级别:
package com.example.simplerpgdorid;
public class Level {
public static String lvl[][] = new String[2][];
public Level(){
lvl[0] = new String[]{
"...p.....p",
"...p.....p",
"...p.....p",
"...p.....p",
"...p.....p",
"...p.....p",
"...p.....p",
"...p.....p",
"...p.....p",
"...p.....p",
};
lvl[1] = new String[]{
"...p.....p",
"...p.....p",
"...p.....p",
"...p.....p",
"...p.pp..p",
"...p.....p",
"...p.....p",
"...p.....p",
"...p.....p",
"...p.....p",
};
}
}
最佳答案
当我从某些本机引擎(例如Unity)使用我的Android库时遇到了这些问题。
这是我不确定何时在需要循环程序的线程上执行代码时使用的方式:
if (Looper.myLooper() == null) {
Looper.prepare();
}
关于java - 无法在尚未调用looper.prepare android的线程内创建处理程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19475589/