【问题标题】:multithreading to add image into surface view多线程将图像添加到表面视图中
【发布时间】:2014-12-30 19:37:29
【问题描述】:

现在我有一个线程来填充我的活动视图。但我希望另一个线程在同一个活动中添加一些文本视图和图像视图。我正在使用 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();
    }
}

【问题讨论】:

    标签: java android multithreading surfaceview


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      我不完全知道您的问题是什么,但关于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 完成后,onPostExecute 被调用,它在 UiThread 上运行,您可以在其中处理视图的更改。

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

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

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

      【讨论】:

      • 我尝试使用嵌套线程,但我意识到它不能达到目的,我正在尝试使用第二个线程将 textview 等小部件推送到视图中,并且嵌套将使其仅在第二个线程之前可见在跑。这是因为在嵌套中,我需要串行而不是并行运行它们(只有在我们推送的东西是原子的时候才有可能)..
      • @prime 是的,您可以串行和并行运行 asynctask。不客气的人
      【解决方案3】:

      用 AsyncTask 类来做。在 doInBackground 方法中下载图像,并在 onPostExecute 方法中将图像应用到 ImageView。

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

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

      【讨论】:

      • @Prime:如果您使用上面链接中的类 (FetchLargeImage),您将实现图像缓存,并且在每次下一次调用时,将返回现有图像,而不是再次下载相同的图像。我很高兴能帮助你。问候;-)
      猜你喜欢
      • 2011-12-06
      • 1970-01-01
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多