所以这是关于 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/