在开发过程中,我发现在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(); } } } }

如此即可完成绘制啦。

更多相关文章

  1. Activity的基本理解
  2. Android(安卓)StudioRecyclerView,fragment,adapter的用法
  3. android事件处理总结--dispatchTouchEvent
  4. Android之RecyclerView巧用payload实现局部刷新
  5. Android(安卓)Binder分析五:Java service的获取和调用
  6. Android(安卓)Weekly Notes Issue #257
  7. Android如何保证一个线程最多只能有一个Looper?
  8. 2010.06.05日志:Android(安卓)Gallery左右循环旋转方法
  9. 秒杀多线程第二篇 多线程第一次亲密接触 CreateThread与_beginth

随机推荐

  1. 每天一算:Remove Nth Node From End of Li
  2. 【图解数据结构】 一组动画彻底理解选择
  3. 每天一算:Valid Parentheses
  4. 每天一算:Reverse String
  5. 【图解数据结构】 一组动画彻底理解快速
  6. 每天一算:Evaluate Reverse Polish Notati
  7. 每天一算:Remove Linked List Elements
  8. 【图解数据结构】 一组动画彻底理解插入
  9. 每天一算:Binary Tree Preorder Traversal
  10. 每天一算:Swap Nodes in Pairs