文章目录
- 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 文件就不介绍,就是两个按钮
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();
}
}