今天主要简单滴说一下android中主线程与子线程之间进行通信的五种方式。大家一定都知道,android中的关于UI的处理都必须在主线程(UI线程)上进行,而android中的主线程如果被阻塞超过5s没有响应就会出现ANR(应用无响应),所以耗时的操作都不应该放在主线程上。因此子线程(工作线程)就正式出场了,可以把耗时操作都放在子线程中。但是这时候也会出现一个问题。就是当需要处理耗时操作时,主线程如何切换到子线程去操作,处理完耗时操作子线程又如何回到主线程上呢。下边就这个问题讨论下。
有以下五种方式:
1.Activity.runOnUiThread(Runnable)
2.View.post(Runnable)
3.View.postDelayed(Runnable, long)
4.Handler
5.AsyncTask
我写了个小demo来简单描述下
首先是一个主界面,有五个按钮,然后针对这5种方式简单写了个页面,点击五个按钮分别跳到这5个页面。下边上代码:
1.BaseActivity
package com.example.cyy.interthread.base;
import android.app.ActivityManager;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;
import java.util.List;
/**
* Created by user on 2017/8/17.
*/
public class BaseActivity extends AppCompatActivity {
public ActivityManager manager;
private StringBuilder builder;
public static final String THREAD_TAG = "thread_tag";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
init();
}
private void init() {
if(manager == null) {
manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
}
}
public void getProcessInfo(boolean isShow){
List<ActivityManager.RunningAppProcessInfo> processes = manager.getRunningAppProcesses();
if(builder == null) {
builder = new StringBuilder();
}
for (ActivityManager.RunningAppProcessInfo processInfo : processes) {
builder.append("当前进程id:")
.append(processInfo.pid)
.append("\n当前线程id:")
.append(Thread.currentThread().getId())
.append("\n当前线程状态:")
.append(Thread.currentThread().getState())
.append("\n");
}
if(isShow){
((TextView) findViewById(android.R.id.text1)).setText(builder.toString());
Log.e(THREAD_TAG, builder.toString());
}
}
}
2.MainActivity
package com.example.cyy.interthread;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import com.example.cyy.interthread.base.BaseActivity;
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void doClick(View v) {
switch (v.getId()) {
case R.id.btn_thread_inter_a:
Intent intent_a = new Intent(this, RunOnUiTestActivity.class);
startActivity(intent_a);
break;
case R.id.btn_thread_inter_b:
Intent intent_b =