Android 工程 synchronized 之模板套用

synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:
修饰对象别名作用的范围作用的对象
代码块同步语句块大括号{}括起来的代码调用这个代码块的对象
方法同步方法整个方法调用这个方法的对象
静态的方法none整个静态方法这个类的所有对象
nonesynchronized后面括号括起来的部分这个类的所有对象

本小节 基于 修饰方法,提供实例代码。后续同步操作可复用此模板:

-1- 构造一个回调函数
public abstract class ResponseListener<T> {
    public void onSuccess(T t){}
    public void onFailure(String msg){}
    public void onProgress(int status){}
}
-2- 构造一个类,实现线程操作
public class SmartKit {
    public SmartKit() {}
    public void run(final ResponseListener<String> listener ){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    for (int i=0 ; i<5 ; i++){
                        Thread.sleep(1000);
                        listener.onProgress(i);
                    }
                    listener.onSuccess("onSuccess.");
                }catch (InterruptedException e){
                    e.printStackTrace();
                    listener.onFailure("onFailure.");
                }
            }
        }).start();
    }
}

-3- UserService类, 其中用到了 synchronized同步了方法块

public class UserService {

    SmartKit mSmartKit;
    boolean  mIsLogin;

    public UserService() {
        mSmartKit = new SmartKit();
        mIsLogin  = false;
    }
    public synchronized boolean run(){
        Log.i("xf","线程开始");
        mSmartKit.run(new ResponseListener<String>() {
            @Override
            public void onSuccess(String s) {
                super.onSuccess(s);
                Log.i("xf","onSuccess: "+s);
                mIsLogin = true;
                synchronized (UserService.this){
                    UserService.this.notifyAll();
                }
            }
            @Override
            public void onFailure(String msg) {
                super.onFailure(msg);
                Log.i("xf","onFailure: "+msg );
                synchronized (UserService.this){
                    UserService.this.notifyAll();
                }
            }
            @Override
            public void onProgress(int status) {
                super.onProgress(status);
                Log.i("xf","onProgress: "+status);
            }
        });
        Log.i("xf","线程已开始,等待过程");
        synchronized (this){
            try {
                Log.i("xf","线程执行中,等待结果通知");
                wait();
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
        Log.i("xf","线程执行结束,得到通知: "+mIsLogin);
        return true;
    }
}

-4- 用一个按钮,执行 UserService.run()

public class MainActivity extends AppCompatActivity {

    UserService mUserService;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mUserService = new UserService();
        Button btnTest = (Button) findViewById(R.id.button);
        btnTest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mUserService.run();
            }
        });

    }

-5- 根据以下log的显示,结合上面代码,大概可以知道整个函数的行驶流程。

<关键看看UserService类中的 run()方法>

I/xf: 线程开始
I/xf: 线程已开始,等待过程
I/xf: 线程执行中,等待结果通知
I/xf: onProgress: 0
I/xf: onProgress: 1
I/xf: onProgress: 2
I/xf: onProgress: 3
I/xf: onProgress: 4
I/xf: onSuccess: onSuccess.
I/xf: 线程执行结束,得到通知: true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值