一个线程中改变主线程组件显示(接口回调实现)
  HvTJUzsxOBtS 2023年11月25日 27 0



文章目录

  • 1、简介
  • 2、功能实现


1、简介

我们经常会遇到在线程中去更改组件状态的一些功能,
当然这种方式有很多种,比如可以通过handler 或者 广播等形式实现,但是这里我们通过接口回调
我们这里做一个demo

主界面是一个 按钮 ,点击跳转到第二个界面,
第二个界面也是一个按钮,点击创建一个线程,并且在线程中,通过接口回调,更改主界面上按钮的显示。
回到主界面。查看主界面按钮文字是否被修改

一个线程中改变主线程组件显示(接口回调实现)_实例化

2、功能实现

整体思路,就是需要在别的文件 B 更改主线程 A 的组件,那么就要 A 给外界留有一个接口,让外界能够通过接口访问内部组件。
(1)定义一个接口 C,里面定义一些执行的方法。
(2)主线程 A 继承这个 C 接口,同时会复写 C 接口的一些方法。
(3) B 需要接口回调更改 A 主线程组件,在B 中先实例化一个接口对象
(4)在 A 中实例化一个 B 对象,并且将自身 上下文对象this,传递给 B 中的 实例化接口对象
(5)B 中实例化接口对象此时被赋值为 A 的上下文,那么执行的接口函数,就会在 A 中执行

1)文件结构

比较简单,xml 文件就不介绍,就是两个按钮

一个线程中改变主线程组件显示(接口回调实现)_Android_02

2)MainActivity.class 主界面

package myapplication.lum.com.myapplication;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener ,HuiDiao.huidiaoChagneCallBackListening {

    String str = "ab";
    Button button;
    HuiDiao huidiao;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = (Button) findViewById(R.id.but);
        button.setOnClickListener(this);
        button.getText().length();

        huidiao = new HuiDiao();
        huidiao.setOnMessageChangeListening(this);//创建回调监听
        Log.i("lum","监听");
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()){
            case R.id.but:
                Intent intent = new Intent(this,HuiDiao.class);
                startActivity(intent);
                Log.i("lum","跳转");
                break;
                default:
                    break;
        }
    }
    @Override
    public void huiDiao() {
        button.setText("主界面被更改");  //通过回调函数设置button上显示
        Log.i("lum","success");
    }
}

3)HuiDiao.class 文件

package myapplication.lum.com.myapplication;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class HuiDiao extends AppCompatActivity implements View.OnClickListener {

    Button button;
    private  static  huidiaoChagneCallBackListening huidaoProject;  //创建监听的实例 (这个应该不用 static ,但是我的这里不定 static  会报 null 对象,没搞明白?)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.but);

        button = (Button) findViewById(R.id.but_huidiao);
        button.setOnClickListener(this);

    }
    @Override
    public void onClick(View v) {
        switch(v.getId()){
            case R.id.but_huidiao:
                Log.i("lum_huidiao","点击回调");
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        huidaoProject.huiDiao();   //实例回调
                    }
                }).start();

                break;

        }
    }
    //主要就是 这一点 将实例化的 对象,传递进来
    public void setOnMessageChangeListening (huidiaoChagneCallBackListening huidaoProject ){
        this.huidaoProject = huidaoProject;
        Log.i("lum_huidiao","传递监听的实例化对象: " + huidaoProject);
    }

    //定义及一个接口用来传递数据   接口可以单独写在一个文件里
    interface huidiaoChagneCallBackListening {
        void huiDiao();
    }
}


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月25日 0

暂无评论

推荐阅读
  A32uB2Hhmc6N   2023年12月12日   47   0   0 MySQLMySQLideide
HvTJUzsxOBtS