多線程雖說很方便,但是如果使用不當就會導致很多問題,比如下面這個例子:
package com.example.anrtest;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;public class MainActivity extends Activity { private byte[] lock = new byte[1]; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); showSth(); showSth(); Button btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showToast(); } }); } private void showSth() { new Thread(new Runnable() { @Override public void run() { synchronized (lock) { while (true) { Log.e("H3c", "show:" + Thread.currentThread().getId()); try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } } } } }).start(); } private void showToast() { synchronized (lock) { Toast.makeText(this, "click", 100).show(); } }}
為了等待線程執行結果,點擊按鈕的時候在UI線程加了一個同步鎖,這樣其實無異於沒有使用線程。
所以新手需要注意的是,千萬不要在UI線程中加同步鎖!否則很容易ANR!