多线程将图像添加到表面视图中

时间:2014-12-30 19:37:29

标签: java android multithreading surfaceview

现在我有一个线程填充了我的活动视图。但是我希望另一个线程在同一个活动中添加一些textview和imageview。我正在使用SurfaceView,我在其中创建了这个线程,我不知道如何添加另一个线程,以便它可以为当前活动的视图做出贡献。

帮帮我..

MyView view;
protected void onCreate(Bundle savedInstanceState) {

    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    view = new MyView(this);

    setContentView(view);
}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    view.pause();
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    view.resume();
}

public class MyView extends SurfaceView implements Runnable {

    Thread threadstill = null;
    boolean isitok = false;
    SurfaceHolder holder;

    public MyView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        holder = getHolder();

    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while (isitok == true) {
            if (!holder.getSurface().isValid()) {
                continue;
            }
            canvas = holder.lockCanvas();
            canvas.drawARGB(255, 255, 255, 255);
            canvas.drawBitmap(<bitmapimage>, x, y, null);
            holder.unlockCanvasAndPost(canvas);
        }

    }


   public void pause() {
        isitok = false;
        while (true) {
            try {
                threadstill.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            break;
        }
        threadstill = null;
    }

    public void resume() {
        isitok = true;
        threadstill = new Thread(this);
        threadstill.start();
    }
}

3 个答案:

答案 0 :(得分:1)

您不能直接从另一个线程操纵用户界面。 主线程负责所有UI更改。 但是,如果您想在后台执行一些昂贵的工作(例如加载图片),您可以将结果发送到UI线程。

Hava查看官方文档:https://developer.android.com/training/multiple-threads/communicate-ui.html

或者在一个类似的问题上:How can I manipulate main thread UI elements from another thread in Android?

答案 1 :(得分:0)

我不确切地知道你的问题是什么,但对于I don't know how to add another thread so that it can contribute to the view of the current activity.你可以使用嵌套类轻松创建一个新线程...只需调用:

Thread myNewThread = new Thread(new Runnable() {
    public void run() {
    //do code here
    }
}).start();

但请注意,您只能更改UIThread的观看次数,因此我会向您推荐AsyncTask

public void myAsyncTask exstends Asynctask<Void,Void,Void> {

....
}

AsyncTask附带了几个methods most importantdoInBackground,您可以执行Network Connections之类的重要内容或其他会冻结UI的内容,或者根本不会在UIThread(网络资料)上允许。

doInBackground完成后调用onPostExecuteUiThread会在{{1}}上运行,您可以在其中处理视图的更改。

要获取更多信息,请查看此链接:

http://developer.android.com/reference/android/os/AsyncTask.html

希望它有所帮助,这就是你要求的。 ;)

答案 2 :(得分:0)

使用AsyncTask类执行此操作。在doInBackground方法下载图像,并在onPostExecute方法中将图像应用于ImageView。

我已经在这里https://github.com/bajicdusko/AndroidJsonProvider/tree/master/app/src/main/java/com/bajicdusko/ajp/tools完成了。

您可以使用我的课程或自己创作。