Android关于在Canvas类里的绘制线程问题汇总
在开发过程中,我发现在Canvas对象使用j2me里面的implements接口后,run方法无法访问本对象的内容等
错误的方式
public class cGame extends View implements Runnable{ ... public void run() { // TODO Auto-generated method stub while(s_isGameRun) { try { this.invalidate(); // 这句是错误的,此句将会抛出Only the original thread that created a view hierarchy can touch its views的异常 } catch (Exception e) { e.printStackTrace(); } } } }
这里的主要原因是Android的相关View和控件不是线程安全的,我们必须做独立的处理这点比J2ME麻烦一些,这里Android给我们提供了很多方法,有关线程的,我们需要了解下J2ME中一些传统的线程创建方法,比如Runnable或直接new Thread(),大家需要了解UI线程、worker线程以及一些概念。今天android开发网说一种简单的方法除了异步任务AsyncTask外使用Handler可以很好的处理,和Win32的消息很像。
于是正确的代码应该为:
1. 第一步: 2. /* 启动Thread */ 3. new Thread(mTasks).start(); 4. 5. 第二部: 6. private Runnable mTasks = new Runnable() 7. { 8. public void run() 9. { 10. while (run) 11. { 12. try 13. { 14. Thread.sleep(IntervalSec * 1000); 15. /* 传送Message给Handler */ 16. mHandler.sendMessage(mHandler.obtainMessage()); 17. //传送数据 25. } 26. catch (InterruptedException e) 27. { 28. // TODO Auto-generated catch block 29. e.printStackTrace(); 30. } 31. } 32. } 33. }; 34. 35. 第三步: 36. Handler mHandler = new Handler() 37. { 38. public void handleMessage(Message msg) 39. { 40. super.handleMessage(msg); 41. doDraw();//此处更新view内容 42. //Log.d("--------", msg.getData().getString("aa")); 43. } 44. };
另外也同样可以使用另外一种方法,使用SurfaceView,自己从写onDraw方法
public class cGame extends SurfaceView implements SurfaceHolder.Callback, Runnable{ private SurfaceHolder mSurfaceHolder; public cGame(Context context) { super(context); mSurfaceHolder = this.getHolder();//获取holder mSurfaceHolder.addCallback(this); initLogo(); s_nextState = GS_STATE_INIT; // TODO Auto-generated constructor stub } public void doDraw(Canvas canvas) { //draw something } public void run() { // TODO Auto-generated method stub while(s_isGameRun) { try { Canvas canvas = mSurfaceHolder.lockCanvas(null);//获得本surface类的绘图句柄 doDraw(canvas); mSurfaceHolder.unlockCanvasAndPost(canvas); } catch (Exception e) { e.printStackTrace(); } } } }
如此即可完成绘制啦。
更多相关文章
- Activity的基本理解
- Android(安卓)StudioRecyclerView,fragment,adapter的用法
- android事件处理总结--dispatchTouchEvent
- Android之RecyclerView巧用payload实现局部刷新
- Android(安卓)Binder分析五:Java service的获取和调用
- Android(安卓)Weekly Notes Issue #257
- Android如何保证一个线程最多只能有一个Looper?
- 2010.06.05日志:Android(安卓)Gallery左右循环旋转方法
- 秒杀多线程第二篇 多线程第一次亲密接触 CreateThread与_beginth