android 之 回调函数

来源:互联网 发布:淘宝店铺押金怎么交 编辑:程序博客网 时间:2024/05/16 05:33

目标:

实现一个自定义的MyThread 类,定义多个其实例,

每个实例调用不同的draw()。

 

 失误点:

canvas 不是传递进来的! 是 通过holder lock得到!!!!!!!!!!!!!!!!!!!

 canvas  //canvas最易出错! 因为它的初始化是在holder.lock

 

 

关于多线程的实现:

thMain = new MyThread(6,1000, myInterface );

这里多了一个回调接口作为参数;

public interface myInterface {public void myIFfun();}


然后再 自定义一个 实现该接口的类叫做 比如 ClassGrassDraw,并在它的myIFfun()中去实现自定义的draw的动作。

以此类推。如此,即实现多个不同的 画的 线程 就实现了。

 

附代码:

public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(new mySur(this));}}
public interface myInterface {public void InterfaceFun();}
public class MyThread extends Thread{private int WholeTime;private int PerTime;private boolean thFlag;private int counter;private mySur Sur; //为了使用其成员WholeThreadFlagprivate myInterface CallBackObj; public MyThread(int WholeTime, int PerTime, myInterface CallBackObj, mySur Sur){this.WholeTime = WholeTime;this.PerTime = PerTime;this.CallBackObj = CallBackObj;this.Sur = Sur;thFlag = true;counter = 0;}private void setTimer(){if(WholeTime != 0){counter += 1;if(counter * PerTime >= WholeTime * 1000){thFlag = false;System.out.println("Timer!! thread exit! ");}}}@Overridepublic void run(){while(Sur.WholeThreadFlag && thFlag){try {CallBackObj.InterfaceFun();// 包含draw 和 logicThread.sleep(PerTime);setTimer();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
import android.content.Context;import android.graphics.Color;import android.graphics.Paint;import android.view.SurfaceHolder;import android.view.SurfaceHolder.Callback;import android.view.SurfaceView;public class mySur extends SurfaceView implements Callback{protected SurfaceHolder holder;protected Paint paint;protected int screenW, screenH;boolean WholeThreadFlag;private MyThread mainThread;private MainDraw mainDraw; public mySur(Context context) {super(context);// TODO Auto-generated constructor stubholder = getHolder();holder.addCallback(this);paint = new Paint();paint.setColor(Color.WHITE);//bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_launcher);}@Overridepublic void surfaceCreated(SurfaceHolder arg0) {// TODO Auto-generated method stubscreenW = getWidth();screenH = getHeight();WholeThreadFlag = true;mainDraw = new MainDraw(this.getContext(),holder,paint);mainThread = new MyThread(0,50,mainDraw,this);mainThread.start();}@Overridepublic void surfaceDestroyed(SurfaceHolder arg0) {// TODO Auto-generated method stubWholeThreadFlag = false;}@Overridepublic void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {// TODO Auto-generated method stub}}
import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.view.SurfaceHolder;public class MainDraw extends mySur implements myInterface{private Canvas canvas;public MainDraw(Context context, SurfaceHolder holder, Paint paint) {super(context);// TODO Auto-generated constructor stubthis.holder = holder;this.paint = paint;}private void reallyDraw(){canvas.drawRect(0, 0, 100, 100, paint);//System.out.println("hhhhhhhhhhhhhello,world!");}private void logic(){}private void draw(){try{canvas = holder.lockCanvas();if(canvas != null){reallyDraw();}}catch(Exception e){}finally{if(canvas != null){holder.unlockCanvasAndPost(canvas);}}}@Overridepublic void InterfaceFun() {// TODO Auto-generated method stubdraw();logic();}}




 

参考:

http://wenku.baidu.com/view/4a4022a4284ac850ad024289.html 

http://wenku.baidu.com/view/78f2cb10866fb84ae45c8d8b.html

原创粉丝点击