2010-07-16 120 views
1

因此,這裏是http://groups.google.com/group/android-developers/browse_thread/thread/16a2216b39513674的一些代碼,其中海報寫道他將想法縮短爲單個線程應用程序。一位他職位以下的受訪者表示,從本質上講,這是非常好的工作,但是多線程會帶來好處,因此不會干擾手機上的其他內容。多線程示例代碼:

我的問題是:顯然,原來的海報減少了,他從多線程的例子中提煉出來,讓他們更容易閱讀,貼出來,很酷。但是,下面的代碼的多線程版本會是什麼樣子?

Runnable會在一個單獨的線程?或者整個回調?或者不是那些而是其他的東西?還要別的嗎?

如果它作爲一個服務運行,然後從服務中產生一個Runnable線程會更好嗎?服務是否被視爲與用戶界面分開的線程?

正如你可以說這個問題是關於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); 
    } 
} 

回答

1

來自谷歌Android團隊題爲Painless threading

與我自己的話說了一大篇閱讀AsyncTask,的AsyncTask,是具有對UI線程中運行兩個方法的智能線程,因此您可以更新這些方法中的UI。

+0

idd AsyncTask是一個生命保護程序。檢查它 – weakwire 2010-07-16 22:34:19