1、简单回调理解
理解回调的基础原理:B有一个任务给A完成,A完成后回调B告诉它我完成。未线程线程,所以用处不大,主要用于理解
class B调用class A,A完成任务后回调回B中。
IB接口:
public interface IB {
public void update();
}
B类:
public class B implements IB{
public static void main(String[] args) {
B b=new B();
System.out.print("回调开始"+Thread.currentThread().toString());
new A(b).execute();
}
@Override
public void update() {
// TODO Auto-generated method stub
System.out.print(" 回调结束"+Thread.currentThread().toString());
}
}
A类:
public class A
{
private IB ib;
public A(IB ib) {
this.ib=ib;
}
public void execute() {
// TODO Auto-generated method stub
System.out.print(" 回调中"+Thread.currentThread().toString());
try {
Thread.sleep(500);//模拟处理任务
ib.update();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
获得输出结果:回调开始Thread[main,5,main] 回调中Thread[main,5,main] 回调结束Thread[main,5,main]。线程肯定没变化,额
2:新建线程回调
在上一个例子的基础上加入线程,IB没有改变
B代码如下:
public class B implements IB{
public static void main(String[] args) {
B b=new B();
System.out.println("回调开始"+Thread.currentThread().toString());
new A(b).execute();
b.work();
}
public void work() {
// TODO Auto-generated method stub
System.out.println("work"+this);
for (int i = 0; i <5; i++) {
System.out.println("主线程working: "+Thread.currentThread().toString());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println(" 回调结束"+Thread.currentThread().toString());
System.out.println("update"+this);
work();
}
}
A代码如下:
public class A
{
private IB ib;
public A(IB ib) {
this.ib=ib;
}
public void execute() {
// TODO Auto-generated method stub
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(" 回调中"+Thread.currentThread().toString());
try {
Thread.sleep(500);
ib.update();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
}
运行结果:
回调开始Thread[main,5,main]
workB@1befab0
主线程working: Thread[main,5,main]
回调中Thread[Thread-0,5,main]
主线程working: Thread[main,5,main]
主线程working: Thread[main,5,main]
主线程working: Thread[main,5,main]
主线程working: Thread[main,5,main]
回调结束Thread[Thread-0,5,main]
updateB@1befab0
workB@1befab0
主线程working: Thread[Thread-0,5,main]
主线程working: Thread[Thread-0,5,main]
异步完成任务,主线程仍在完成自己的工作。但是回调时线程仍为A线程,android中为这个使用handler解决,因为大概是4.0以后其非主线程不许修改UI界面。java中应该可以忽略这一点。但是此回调可以回到B类中