更新UI界面:由於性能要求,Android不能在子線程中訪問UI控件,只能在UI線程中更新UI,如果要想在其他線程中更新UI,可以通過以下幾種方法更新UI:
1、使用Handler的handleMessage(Message msg)方法;
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
mTextView.setText("子線程通過handleMessage更新後的UI");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.text_view_handle_send);
new MyThread().start();
}
class MyThread extends Thread {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message message = Message.obtain();
handler.sendMessage(message);
}
}
}
2、使用Handler的post(new Runnable())方法;
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.text_view_handle_post);
handler.post(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mTextView.setText("子線程通過post方法更新後的UI");
}
});
}
}
3、使用runOnUiThread(new Runnable())方法,此方法只能運行在Activity當中;
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.text_view_run_on_ui);
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mTextView.setText("子線程通過runOnUiThread方法更新後的UI");
}
});
}
}
4、使用View的post(new Runnable())方法,其底層也是調用Handler.post(new Runnable())方法;
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.text_view_post);
mTextView.post(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mTextView.setText("子線程通過view.post方法更新後的UI");
}
});
}
}
5、使用AsyncTask異步任務類;
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.text_view_async_task);
new MyAsyncTask().execute();
}
class MyAsyncTask extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String str = "子線程通過AsyncTask異步更新後的UI";
// 返回結果給到onPostExecute方法
return str;
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String result) {
mTextView.setText(result);
super.onPostExecute(result);
}
}
}