2021-10-29

加粗样式
package com.zzl.solibrarycreate;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Observer;

/**

  • Created by zhenglin.zhu on 2020/5/11.
    */
    public class LiveDataBus {
    private final Map<String, BusMutableLiveData> bus;

    private LiveDataBus() {
    bus = new HashMap<>();
    }

    private static class SingletonHolder {
    private static final LiveDataBus DEFAULT_BUS = new LiveDataBus();
    }

    public static LiveDataBus get() {
    return SingletonHolder.DEFAULT_BUS;
    }

    public MutableLiveData with(String key, Class type) {
    if (!bus.containsKey(key)) {
    bus.put(key, new BusMutableLiveData<>());
    }
    return (MutableLiveData) bus.get(key);
    }

    public MutableLiveData with(String key) {
    return with(key, Object.class);
    }

    private static class ObserverWrapper implements Observer {

     private Observer<T> observer;
    
     public ObserverWrapper(Observer<T> observer) {
         this.observer = observer;
     }
    
     @Override
     public void onChanged(@Nullable T t) {
         if (observer != null) {
             if (isCallOnObserve()) {
                 return;
             }
             observer.onChanged(t);
         }
     }
    
     private boolean isCallOnObserve() {
         StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
         if (stackTrace != null && stackTrace.length > 0) {
             for (StackTraceElement element : stackTrace) {
                 if ("android.arch.lifecycle.LiveData".equals(element.getClassName()) &&
                         "observeForever".equals(element.getMethodName())) {
                     return true;
                 }
             }
         }
         return false;
     }
    

    }

    private static class BusMutableLiveData extends MutableLiveData {

     private Map<Observer, Observer> observerMap = new HashMap<>();
    
     @Override
     public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
         super.observe(owner, observer);
         try {
             hook((Observer<T>) observer);
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
    
     @Override
     public void observeForever(@NonNull Observer<? super T> observer) {
         if (!observerMap.containsKey(observer)) {
             observerMap.put(observer, new ObserverWrapper(observer));
         }
         super.observeForever(observerMap.get(observer));
     }
    
     @Override
     public void removeObserver(@NonNull Observer<? super T> observer) {
         Observer realObserver = null;
         if (observerMap.containsKey(observer)) {
             realObserver = observerMap.remove(observer);
         } else {
             realObserver = observer;
         }
         super.removeObserver(realObserver);
     }
    
     private void hook(@NonNull Observer<T> observer) throws Exception {
         //get wrapper's version
         Class<LiveData> classLiveData = LiveData.class;
         Field fieldObservers = classLiveData.getDeclaredField("mObservers");
         fieldObservers.setAccessible(true);
         Object objectObservers = fieldObservers.get(this);
         Class<?> classObservers = objectObservers.getClass();
         Method methodGet = classObservers.getDeclaredMethod("get", Object.class);
         methodGet.setAccessible(true);
         Object objectWrapperEntry = methodGet.invoke(objectObservers, observer);
         Object objectWrapper = null;
         if (objectWrapperEntry instanceof Map.Entry) {
             objectWrapper = ((Map.Entry) objectWrapperEntry).getValue();
         }
         if (objectWrapper == null) {
             throw new NullPointerException("Wrapper can not be bull!");
         }
         Class<?> classObserverWrapper = objectWrapper.getClass().getSuperclass();
         Field fieldLastVersion = classObserverWrapper.getDeclaredField("mLastVersion");
         fieldLastVersion.setAccessible(true);
         //get livedata's version
         Field fieldVersion = classLiveData.getDeclaredField("mVersion");
         fieldVersion.setAccessible(true);
         Object objectVersion = fieldVersion.get(this);
         //set wrapper's version
         fieldLastVersion.set(objectWrapper, objectVersion);
     }
    

    }
    }

资源下载链接为: https://pan.quark.cn/s/9648a1f24758 在Java项目开发中,IntelliJ IDEA为Maven项目引入本地jar包提供了便捷方法。以下是详细步骤: 启动IDEA,进入目标Maven项目。若右侧工具栏未显示Maven面板,可通过View -> Tool Windows -> Maven将其打开。 在Maven面板里,找到带有小箭头的命令行输入框,点击箭头图标,弹出用于输入Maven命令的窗口。 在该窗口输入特定的Maven命令,用以将本地jar包安装至本地Maven仓库。命令格式如下: 例如,若test.jar位于F:\目录,想将其作为test组ID下的test模块,版本0.0.1,jar格式,命令则为: 输入完毕后,点击运行。若无意外,Maven将执行命令,把jar包安装到本地仓库,并显示“BUILD SUCCESS”,表明操作成功。 接下来,在项目的pom.xml文件中添加新依赖,以便IDEA知晓编译和运行时需用到该jar包。添加如下代码: 保存pom.xml文件后,IDEA会自动检测到变动并更新项目配置。至此,Maven项目已能使用刚导入的本地jar包。 总的来说,通过上述流程,我们实现了在IDEA Maven项目中导入本地jar包。这适用于开发中所需的自定义库以及未通过公共Maven仓库发布的第三方组件。务必正确配置groupId、artifactId和version,以维持项目整洁和可维护性。当项目结构或依赖有变动时,要及时更新pom.xml,确保项目正常运行。希望这个教程对你在IDEA中管理Maven项目有所帮助,若有更多相关问题,可继续查阅文档和资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值