【安卓】主线程与子线程的五种通信方式

今天主要简单滴说一下android中主线程与子线程之间进行通信的五种方式。大家一定都知道,android中的关于UI的处理都必须在主线程(UI线程)上进行,而android中的主线程如果被阻塞超过5s没有响应就会出现ANR(应用无响应),所以耗时的操作都不应该放在主线程上。因此子线程(工作线程)就正式出场了,可以把耗时操作都放在子线程中。但是这时候也会出现一个问题。
摘要由CSDN通过智能技术生成

今天主要简单滴说一下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 = 
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值