Android中的线程
android中的主线程
是包装在activitythreead类中
public static void main(String[] args) {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");
SamplingProfilerIntegration.start();
// CloseGuard defaults to true and can be quite spammy. We
// disable it here, but selectively enable it later (via
// StrictMode) on debug builds, but using DropBox, not logs.
CloseGuard.setEnabled(false);
Environment.initForCurrentUser();
// Set the reporter for event logging in libcore
EventLogger.setReporter(new EventLoggingReporter());
AndroidKeyStoreProvider.install();
// Make sure TrustedCertificateStore looks in the right place for CA certificates
final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
TrustedCertificateStore.setDefaultUserDirectory(configDir);
Process.setArgV0("<pre-initialized>");
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
thread.attach(false);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
}
// End of event ActivityThreadMain.
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
为我们开启了一个默认的looper
子线程为什么不能更新UI
因为UI访问是没有加锁的,在多个线程中访问UI是不安全的,如果有多个子线程都去更新UI,会导致界面不断改变而混乱不堪。所以最好的解决办法就是主线程更新UI。
如何让子线程更新UI
在onresume之前更新UI
public class MainActivity extends AppCompatActivity { private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView=(TextView)findViewById(R.id.textView); new Thread(new Runnable() { @Override public void run() { mTextView.setText("Child Thread"); } }).start(); } }
这是因为线程的检查工作是在ViewRoot中完成的。
viewroot又是在onresume中创建的 所以这种办法是可行的。
- 通过SurfaceView
SurfaceView是 android 里唯一一个可以在子线程更新的控件。
SurfaceView可以在主线程之外的线程中向屏幕绘图。
这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。当需要快速,主动地更新View的UI,或者当前渲染代码阻塞GUI线程的时间过长的时候,SurfaceView就是解决上述问题的最佳选择。
子线程与主线程通讯
所有的View都提供了view.post view.postDelayed方法
也可以使用activity.runonuithread
也可以使用handler来通讯