android - 多线程此示例代码 :

标签 android

所以这是关于 http://groups.google.com/group/android-developers/browse_thread/thread/16a2216b39513674 的一些代码发布者在其中写道,他将想法缩短为单线程应用程序。他帖子下方的一位回复者说,从本质上讲,这是一项很棒的工作,但多线程也有好处,因此不会干扰您手机上的其他内容。

我的问题是:显然,最初的发帖者从他看到的多线程示例中简化、提炼了想法,以便于阅读,发布它们,很酷。但是下面代码的多线程版本会是什么样子呢?

Runnable 会在一个单独的线程上吗?还是整个回调?或者不是那些而是别的什么?还有什么吗?

如果它作为服务运行,然后从服务中生成一个 Runnable 线程,会不会更好?服务是否被视为独立于 UI 的线程?

正如您所知,这个问题是关于 Android 多线程的基础知识。感谢您提供任何信息。

public class Something extends Activity { 
    @Override
    protected void onCreate(Bundle saved) { 
      super.onResume(); 
      final EGL10 egl = (EGL10) EGLContext.getEGL(); 
      final EGLDisplay eglDisplay = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); 
      int[] version = new int[2]; 
      egl.eglInitialize(eglDisplay, version); 

      int[] configSpec = { 
          // EGL10.EGL_DEPTH_SIZE, 8, 
          EGL10.EGL_NONE 
      }; 

      final EGLConfig[] config = new EGLConfig[1]; 
      int num_configs[] = new int[1]; 
      egl.eglChooseConfig(eglDisplay, configSpec, config, 1, num_configs); 
      final EGLContext eglContext = egl.eglCreateContext(eglDisplay, config[0], EGL10.EGL_NO_CONTEXT, null); 

      // Setting up layouts and views 
      SurfaceView view = new SurfaceView(this); 
      setContentView(view); 

      SurfaceHolder holder = view.getHolder(); 
      holder.setType(SurfaceHolder.SURFACE_TYPE_GPU); 
      final GL10 gl = (GL10) eglContext.getGL(); 
      final Handler handler = new Handler(); 

      holder.addCallback(new Callback() {
        private EGLSurface surface; 
        private Runnable painter; 

        @Override 
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
          // initialize GL projection and other stuff 
          // gl.glMatrixMode(GL10.GL_PROJECTION); 
          // gl.glFrustumf(left, right, bottom, top, zNear, zFar); 
          // ... 
          painter = new Runnable() { 
            @Override 
            public void run() { 
              drawFrame(gl); 
              egl.eglSwapBuffers(eglDisplay, surface); 
              handler.post(this); 
            } 
          }; 
          handler.post(painter); 
        } 
        @Override 
        public void surfaceCreated(SurfaceHolder holder) { 
          surface = egl.eglCreateWindowSurface(eglDisplay, config[0], holder, null); 
          egl.eglMakeCurrent(eglDisplay, surface, surface, eglContext); 
        } 
        @Override 
        public void surfaceDestroyed(SurfaceHolder holder) { 
          handler.removeCallbacks(painter); 
        } 
      });
    } 

    private void drawFrame(GL10 gl) { 
      // Frame drawing... 
      long t = System.currentTimeMillis() % 10000; 
      gl.glClearColor(t / (float) 10000, t / (float) 10000 ,1 , 1); 
      gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
    } 
}

最佳答案

了解 AsyncTask在 Google Android 团队的一篇题为 Painless threading 的精彩文章中

正如我自己所说,AsyncTask 是一个智能线程,它有两个在 UI 线程上运行的方法,因此您可以在这些方法中更新您的 UI。

关于android - 多线程此示例代码 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3267554/

相关文章:

未以 root 用户身份运行时出现 Android Studio 错误

java - 将 HashMap 写入 SQL 数据库时出错 - Android Studio

java - bbcode 中十六进制颜色代码的正则表达式?

android - 在模拟器上运行的 ContentResolver 找不到 mp3 文件

java - SimpleDateFormat 与日历给出错误的日期

java - 检查字符串是否仅包含字母 - 电子邮件验证

android - ViewPager 问题

android - 当后台 "sleeping"应用程序过多时,Android 操作系统会发生什么情况?

android - 在带有图像的 ListView 中延迟加载。 (游标适配器)

java - 在坐标处射箭时考虑重力