目标:
实现一个自定义的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 { @Override protected 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; //为了使用其成员WholeThreadFlag private 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! "); } } } @Override public void run(){ while(Sur.WholeThreadFlag && thFlag){ try { CallBackObj.InterfaceFun();// 包含draw 和 logic Thread.sleep(PerTime); setTimer(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.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 stub holder = getHolder(); holder.addCallback(this); paint = new Paint(); paint.setColor(Color.WHITE); //bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_launcher); } @Override public void surfaceCreated(SurfaceHolder arg0) { // TODO Auto-generated method stub screenW = getWidth(); screenH = getHeight(); WholeThreadFlag = true; mainDraw = new MainDraw(this.getContext(),holder,paint); mainThread = new MyThread(0,50,mainDraw,this); mainThread.start(); } @Override public void surfaceDestroyed(SurfaceHolder arg0) { // TODO Auto-generated method stub WholeThreadFlag = false; } @Override public 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 stub this.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); } } } @Override public void InterfaceFun() { // TODO Auto-generated method stub draw(); logic(); } }
参考: