使用搜索栏将数据从主活动传递到SurfaceView线程

时间:2012-11-19 22:30:08

标签: android multithreading surfaceview

我有一个主要活动类,我还有一个SurfaceView类,它在我的主要活动开始时启动。

我在主要活动中有一个搜索栏。我想将搜索栏产生的任何数据发送到SurfaceView,以便每次更改时都显示它。

我该怎么做?

感谢。

这是我的SurfaceView类:

public class SurfaceViewGauge extends SurfaceView implements SurfaceHolder.Callback{


 private MySurfaceThread thread;
 private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

 public SurfaceViewGauge(Context context) {
  super(context);
  // TODO Auto-generated constructor stub
  init();
 }

 public SurfaceViewGauge(Context context, AttributeSet attrs) {
  super(context, attrs);
  // TODO Auto-generated constructor stub
  init();
 }

 public SurfaceViewGauge(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  // TODO Auto-generated constructor stub
  init();
 }

  private void init(){
    getHolder().addCallback(this);
    thread = new MySurfaceThread(getHolder(), this);

    setFocusable(true); // make sure we get key events

    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(3);
    paint.setColor(Color.WHITE);

   }

 public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
  // TODO Auto-generated method stub

 }

 public void surfaceCreated(SurfaceHolder holder) {
  // TODO Auto-generated method stub
  thread.setRunning(true);
  thread.start();

 }

 public void surfaceDestroyed(SurfaceHolder holder) {
  // TODO Auto-generated method stub
  boolean retry = true;
  thread.setRunning(false);
  while (retry) {
   try {
    thread.join();
    retry = false;
   }
   catch (InterruptedException e) {
   }
  }
 }

 @Override
 protected void onDraw(Canvas canvas) {
  // TODO Auto-generated method stub

 }


}

这是我的Thread类:

    public class MySurfaceThread extends Thread {
 private SurfaceHolder myThreadSurfaceHolder;
 private SurfaceViewGauge myThreadSurfaceView;
 private boolean myThreadRun = false;

 public MySurfaceThread(SurfaceHolder surfaceHolder, SurfaceViewGauge surfaceView) {
  myThreadSurfaceHolder = surfaceHolder;
  myThreadSurfaceView = surfaceView;
 }

 public void setRunning(boolean b) {
  myThreadRun = b;
 }

 @Override
 public void run() {
  // TODO Auto-generated method stub
  while(myThreadRun){
   Canvas c = null;

   try{
    c = myThreadSurfaceHolder.lockCanvas(null);
    synchronized (myThreadSurfaceHolder){
     myThreadSurfaceView.onDraw(c);
    }
    sleep(0);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   finally{
    // do this in a finally so that if an exception is thrown
    // during the above, we don't leave the Surface in an
    // inconsistent state
    if (c != null) {
     myThreadSurfaceHolder.unlockCanvasAndPost(c);
    }
   }
  }
 }

}

2 个答案:

答案 0 :(得分:1)

在您的代码中,添加处理程序..

public Handler mhandler;

public SurfaceViewGauge(Context context, Handler mhandler) 
{
super(context);
this.mhandler = mhandler;
// TODO Auto-generated constructor stub
init();
}

在上面的代码中,使用Handler对象发送代码。

答案 1 :(得分:1)

你的MainActivity中的

声明一个静态变量,它将保持搜索栏值并在你的surfaceview代码中借助于handler来调用那个静态变量   e.g。

MainClass.seekValue;