Vorbei Kontext-Handler
Ist es möglich, Argumente zu einem Android-Handler?? Ich habe zwei Stücke von code.
new Thread(){
public void run(){
for(;;){
uiCallback.sendEmptyMessage(0);
Thread.sleep(2000); //sleep for 2 seconds
}
}
}.start();
private Handler uiCallback = new Handler(){
public void handleMessage(Message msg){
//add a new blossom to the blossom ArrayList!!
blossomArrayList.add(new Blossom(context, R.drawable.blossom));
}
};
Ich natürlich eine Fehlermeldung, da die Handler-Methode kann nicht sehen, mein Kontext. Dies ist wahrscheinlich, weil dieses Stück code
public BoardView(Context context){
super(context);
Kontext ist nicht sichtbar anderswo, und ich wundere mich, wenn ich kann, übergeben Sie als argument an meinem Handler.
EDIT: ich bin Entsendung der zwei wichtigsten Stücke von code, die Antwort auf eine Frage, warum meine Blossom Objekt-Kontext. Ich selbst bin nicht 100% sicher, dass >.> Vielleicht könnten Sie einen Blick und sehen, was Los ist.
public class Blossom{
private Bitmap blossom;
private float blossomX = 0;
private float blossomY = 0;
private Random generator = new Random();
public Blossom(Context context, int drawable)
{
blossom = BitmapFactory.decodeResource(context.getResources(), drawable);
blossomX = generator.nextInt(300);
}
public Bitmap getBitmap()
{
return blossom;
}
public float getBlossomX()
{
return blossomX;
}
public float getBlossomY()
{
return blossomY;
}
public void Fall(Canvas canvas, float boxY)
{
//draws the flower falling
canvas.drawBitmap(blossom, blossomX,
blossomY = blossomY+3 , null);
//collision detection, currently not working after
//implementing random start location
//if(blossomY + 29 == boxY)
//{
//canvas.drawBitmap(blossom,0,0,null);
//}
}
}
public class BoardView extends SurfaceView implements SurfaceHolder.Callback{
Context mContext;
Bitmap box =
(BitmapFactory.decodeResource
(getResources(), R.drawable.box));
private BoardThread thread;
private float box_x = 140;
private float box_y = 378;
private float boxWidth = box.getWidth();
private float boxHeight = box.getHeight();
private ArrayList<Blossom> blossomArrayList = new ArrayList<Blossom>();;
boolean mode = false;
RectF boxRect = new RectF(box_x,box_y, box_x + boxWidth, box_y + boxHeight);
public BoardView(Context context){
super(context);
//surfaceHolder provides canvas that we draw on
getHolder().addCallback(this);
//controls drawings
thread = new BoardThread(getHolder(),this);
//pass variables to instance of Blossom
//for(int i = 0; i <= 3; i++)
//{
//blossomArrayList.add(new Blossom(context, R.drawable.blossom));
//}
new Thread(){
public void run(){
for(;;){
uiCallback.sendEmptyMessage(0);
Thread.sleep(2000); //sleep for 2 seconds
}
}
}.start();
//intercepts touch events
setFocusable(true);
}
@Override
public void onDraw(Canvas canvas){
canvas.drawColor(Color.WHITE);
//draw box and set start location
canvas.drawBitmap(box, box_x - (boxWidth/2),
box_y - (boxHeight/2), null);
for(int i = 0; i<= 3; i++)
{
blossomArrayList.get(i).Fall(canvas, box_y);
}
}
@Override
public boolean onTouchEvent(MotionEvent event){
if(event.getAction() == MotionEvent.ACTION_DOWN){
if(boxRect.contains(event.getX(),event.getY())){
mode = true;
}
}
if(event.getAction() == MotionEvent.ACTION_MOVE) {
if(boxRect.contains(event.getX(),event.getY())){
mode = true;
}
if(mode == true){
box_x = (int)event.getX();
boxRect.set(box_x,box_y, box_x + boxWidth, box_y + boxHeight);
}
}
if(event.getAction() == MotionEvent.ACTION_UP){
mode = false;
}
invalidate();
return true;
}
@Override
public void surfaceChanged(SurfaceHolder holder,
int format, int width, int height ){
}
@Override
public void surfaceCreated(SurfaceHolder holder){
thread.startRunning(true);
thread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder){
thread.startRunning(false);
thread.stop();
}
private Handler uiCallback = new Handler(){
public void handleMessage(Message msg){
//add a new blossom to the blossom ArrayList!!
blossomArrayList.add(new Blossom(context, R.drawable.blossom));
}
};
}
InformationsquelleAutor Hani Honey | 2011-03-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was ist, wenn Sie erstellen eine Unterklasse erweitert Handler? So könnte man Parameter übergeben, die Sie wollen.
Aber nur aus Neugier, warum hat die Blüte Objekt erfordern Kontext-Objekt? Es ist normalerweise am besten zu trennen Logik von GUI-Abhängigkeiten.
Es war der einzige Weg, ich könnte herausfinden, wie man eine bitmap in meine Blossom-Klasse, das ist, warum.
Auch Ihre Blüte Konstruktor könnte einfach nehmen Sie das bitmap statt. Aber trotzdem, was Sie wollen, kann erreicht werden, indem man einfach eine neue Klasse sagen MyHandler die sich Handler und erstellen Sie einen Konstruktor public "MyHandler" (Kontext Kontext) {...} ist.
Danke - ich habe gerade übergeben Sie die bitmap und es war in Ordnung 😀 Warum habe ich das nicht getan in den ersten Platz...
kein problem! 🙂
InformationsquelleAutor kkudi
Erstellen Sie eine Klasse, die Sie erweitert Handler, und speichern Sie eine schwache Referenz auf den Kontext. Dies wird helfen, verhindern, dass einige Speicher-Probleme.
InformationsquelleAutor PearsonArtPhoto