当前位置: 首页 > article >正文

深入Android架构(从线程到AIDL)_24 活用IBinder接口于近程通信02

3、 留意线程的角色

  • 在上述的范例程序,都是由主线程所执行的。 由主线程执行所有的调用。 如下图:

也可以创建小线程执行对IS接口的调用
  • 例如将上述onClick()函数内容改写为:
    public void onClick(View v) {
        th1 = new Thread(this);
        th1.start();
    }
    
    public void run() {
        //……. isv.f1()
    }

    就诞生小线程去调用IS接口了,如下图:

       

 程序代码
// ILoad.java
// ………
interface ILoad {
    boolean loadImage();
    boolean cancel();
}

// myService.java
// ………
public class myService extends Service implements ILoad{
    private final IBinder mBinder;
    @Override public IBinder onBind(Intent intent) {
        return mBinder;
    }

    @Override public void onCreate(){
        super.onCreate();
        mBinder = new myBinder();
    }

    public class myBinder extends Binder{
        ILoad getService(){
            return myService.this;
        }
    }

    @Override public boolean loadImage() {
        // loading image from cloud
    }

    @Override public boolean cancel() {
        // cancel loading
    }
}


// myActivity.java
// ……….
public class myActivity extends Activity implements OnClickListener {
    ILoad isv;
    Thread th1;
    // ……..
    @Override public void onCreate(Bundle savedInstanceState) {
        // ………
        Intent intent = new Intent(this,myService.class);
        bindService(intent, mConnection,Context.BIND_AUTO_CREATE);
    }

    private ServiceConnection mConnection = new ServiceConnection(){
        @Override public void onServiceConnected(ComponentName className, IBinder ibinder) {
            myBinder ib = (myBinder)ibinder;
            isv = ib.getService();
        }

        @Override public void onServiceDisconnected(
            ComponentName arg0) { }
    };

    @Override public void onClick(View v) {
        switch( v.getId() ){
            case 101:
                th1 = new Thread(this);
                th1.start();
                break;
            case 102:
                isv.cancel();
                break;
            default:
                break;
        }
    }

    public void run() {
        isv.loadImage();
    }
}
  • 在这个范例里,活用Android框架提供的Binder基类和IBinder接口。
  • 然后配合myService的onBind()函数,将myBinder的IBinder接口回传给myActivity。
  • 接着, myActivity并不透过 IBinder接口来调用myService的服务。而是直接调用了myService的IS接口。
  • 此外,可擅用小线程来执行比较耗时的服务。


 


http://www.kler.cn/a/500021.html

相关文章:

  • 数据库序列的使用、常见场景与优劣势分析
  • Linux通过ISCSI连接StarWind共享存储
  • 6.business english--updates
  • Matplotlib 直方图:数据可视化基础
  • 深入NLP核心技术:文本张量表示与词嵌入全面解析
  • 【GESP】C++二级练习 luogu-B2080, 计算多项式的值
  • Iterator 与 ListIterator 的区别
  • 头部(Header)
  • Vulnhub-Red靶机笔记
  • FFmpeg音视频流媒体,视频编解码性能优化
  • 【pikachu】靶场中爆破模块的token检测,如何使用burp进行爆破
  • Vue3框架核心功能点响应式数据reactive、组合式API setup、computed、组件通信、路由导航,状态管理vuex、pinia等的实战示例代码
  • 从0开始搭建MySQL服务 | 创建库 、创建表、数据写入、查数据
  • Qt 智能指针
  • 三维卷积( 3D CNN)
  • 通过一个含多个包且引用外部jar包的项目实例感受Maven的便利性
  • js前序遍历等
  • git - 用SSH方式迁出远端git库
  • 从0开始分享一个React项目(二):React-ant-admin
  • docker配置镜像加速
  • 【LC】3270. 求出数字答案
  • 【钉钉在线笔试题】字符串表达式的加减法
  • 监听器与RBAC权限模型
  • Python的循环