- 模塊化開發
- List item
- 代碼生成器model
從註解獲取信息,通過annotationProcessor或apt生成代碼
家裏項目使用annotationProcesso - 核心model
-
分別建立各模塊
atte-annotations
latte-compiler 編譯模塊
latte-core 核心庫
latte-ec 電商模塊 -
添加依賴
latte-core依賴於latte-annotations
latte-ec 依賴於latte-core
app依賴於latte-ec,latte-compiler -
一:開始編寫項目 :項目架構初始化
1、latte-core
筆記:
WeakHashMap:裏面的鍵值對在不使用的時候會自動回收,而且非常及時,避免內存爆滿
代碼:
- Configurator.class
/**
* Created by liusihui on 2019/11/05
* 模塊功能:配置文件的存儲以及獲取
**/
package com.lsh.latte_core.app;
import java.util.WeakHashMap;
public class Configurator {
private static final WeakHashMap<String,Object> LATTE_CONFIGS=new WeakHashMap<>();
private Configurator(){
LATTE_CONFIGS.put(ConfigType.CONFIG_READY.name(),false); //配置開始了,但是沒有完成
}
//線程安全的懶漢模式
public static Configurator getInstance(){
return Holder.INSTANCE;
}
//直接返回
final WeakHashMap<String,Object> getLatteConfigs(){
return LATTE_CONFIGS;
}
//靜態內部類單例模式的初始化
private static class Holder{
private static final Configurator INSTANCE=new Configurator();
}
public final void configure(){
LATTE_CONFIGS.put(ConfigType.CONFIG_READY.name(),true);//配置開始了,並且已經完成
}
//開始實例化API—HOST
public final Configurator withApiHost(String host){
LATTE_CONFIGS.put(ConfigType.API_HOST.name(),host);
return this;
}
/*
*
* 檢查配置是否正確
* 設置爲不可更改
*
*
* 在應用程序中獲取調用
* */
private void checkConfiguration(){
final boolean isReady=(boolean)LATTE_CONFIGS.get(ConfigType.CONFIG_READY.name());
//如果配置並沒有完成,拋出一個運行時異常
if (!isReady){
throw new RuntimeException("Configuration id not ready,call configure");
}
}
/*
* @SuppressWarnings("unchecked") 沒有檢測過的
* */
@SuppressWarnings("unchecked")
final <T> T getConfiguration(Enum<ConfigType> key){
checkConfiguration();
return (T) LATTE_CONFIGS.get(key);
}
}
- ConfigType
package com.lsh.latte_core.app;
/*
* 枚舉類:在整個應用程序裏是唯一的單例,也只能初始化一次
*
* 要在進行多線程操作的時候,完全可以用枚舉類惰性單例的初始化(線程安全的懶漢模式哈哈哈哈)
* */
public enum ConfigType {
API_HOST, //網絡請求域名
APPLICATION_CONTEXT, //全局的上下文
CONFIG_READY, //控制初始化或配置是否完成
ICON //存儲自己的初始化項目
}
- Latte
/**
- Created by liusihui on 2019/11/05
- 模塊功能:
**/
package com.lsh.latte_core.app;
import android.content.Context;
import java.util.WeakHashMap;
public final class Latte {
public static Configurator init(Context context){
getConfigurations().put(ConfigType.APPLICATION_CONTEXT.name(),context.getApplicationContext());
return Configurator.getInstance();
}
private static WeakHashMap<String,Object> getConfigurations(){
return Configurator.getInstance().getLatteConfigs();
}
}
2、APP
- ExampleApp
/**
* Created by liusihui on 2019/11/05
* 模塊功能:
**/
package com.lsh.fastec;
import com.lsh.latte_core.app.Latte;
import android.app.Application;
public class ExampleApp extends Application {
@Override
public void onCreate() {
super.onCreate();
Latte.init(this)
.withApiHost("http://localhost:8080")
.configure();
}
}
- 二:集成第三方字體圖標庫iconify
由於項目中會用到很多圖片,圖片過多或者過大會導致項目較大,哈哈哈哈但是!iconify可以解決這個問題!那麼甩鏈接
Github地址:添加鏈接描述
代碼:
1、添加依賴
//字體圖標
implementation 'com.joanzapata.iconify:android-iconify-fontawesome:2.2.2' // (v4.5)
implementation 'com.joanzapata.iconify:android-iconify-entypo:2.2.2' // (v3,2015)
implementation 'com.joanzapata.iconify:android-iconify-typicons:2.2.2' // (v2.0.7)
implementation 'com.joanzapata.iconify:android-iconify-material:2.2.2' // (v2.0.0)
implementation 'com.joanzapata.iconify:android-iconify-material-community:2.2.2' // (v1.4.57)
implementation 'com.joanzapata.iconify:android-iconify-meteocons:2.2.2' // (latest)
implementation 'com.joanzapata.iconify:android-iconify-weathericons:2.2.2' // (v2.0)
implementation 'com.joanzapata.iconify:android-iconify-simplelineicons:2.2.2' // (v1.0.0)
implementation 'com.joanzapata.iconify:android-iconify-ionicons:2.2.2' // (v2.0.1)
2、在package com.lsh.latte_core.app.Configurator初始化
//封裝下字體圖標iconify
private static final ArrayList<IconFontDescriptor> ICONS=new ArrayList<>();
//初始化字體圖標
private void initIcons(){
if (ICONS.size()>0){
final Iconify.IconifyInitializer initializer=Iconify.with(ICONS.get(0));
for (int i = 0; i <ICONS.size() ; i++) {
initializer.with(ICONS.get(i));
}
}
}
/*
* 加入自己的字體圖標
* */
public final Configurator withIcon(IconFontDescriptor descriptor){
ICONS.add(descriptor);
return this;
}
3、在APP中調用
public void onCreate() {
super.onCreate();
Latte.init(this)
.withIcon(new FontAwesomeModule())
.withApiHost("http://10.10.110.38/")
.configure();
}
4、定義自己的圖標字體:如阿里巴巴矢量圖標
操作步驟:
然後在latte-ec中創建assets,將iconfont.ttf放入
代碼:
1、package com.lsh.latte.ec.icon.FontRcMoudle
/**
- Created by liusihui on 2019/11/05
- 模塊功能:
**/
package com.lsh.latte.ec.icon;
import com.joanzapata.iconify.Icon;
import com.joanzapata.iconify.IconFontDescriptor;
public class FontRcMoudle implements IconFontDescriptor {
@Override
public String ttfFileName() {
return "iconfont.ttf";
}
@Override
public Icon[] characters() {
return EcIcons.values();
}
}
2、創建枚舉類EcIcons
/**
* Created by liusihui on 2019/11/05
* 模塊功能:
**/
package com.lsh.latte.ec.icon;
import com.joanzapata.iconify.Icon;
public enum EcIcons implements Icon {
//掃描二維碼和支付的字體
icon_scan('\ue606'),
icon_ali_pay('\ue606');
private char character;
EcIcons(char character){
this.character=character;
}
@Override
public String key() {
return name().replace('_','-');
}
@Override
public char character() {
return character;
}
}
3、Activity初始化
/**
* Created by liusihui on 2019/11/05
* 模塊功能:
**/
package com.lsh.fastec;
import com.joanzapata.iconify.fonts.FontAwesomeModule;
import com.lsh.latte.ec.icon.FontRcMoudle;
import com.lsh.latte_core.app.Latte;
import android.app.Application;
public class ExampleApp extends Application {
@Override
public void onCreate() {
super.onCreate();
Latte.init(this)
.withIcon(new FontAwesomeModule())
.withIcon(new FontRcMoudle())
.withApiHost("http://10.10.110.38/")
.configure();
}
}
- 集成fragment依賴、butterkniffer黃油刀
//fragment依賴
implementation 'me.yokeyword:fragmentation:0.10.1'
implementation 'me.yokeyword:fragmentation-swipeback:0.7.9'
代碼實現:
1、package com.lsh.latte_core.delegates;BaseDelegate
/**
- Created by liusihui on 2019/11/05
- 模塊功能:基礎的Delegate
- 不希望以後的使用者創造實例,所以abstract整一個抽象類
**/
package com.lsh.latte_core.delegates;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import me.yokeyword.fragmentation_swipeback.SwipeBackFragment;
public abstract class BaseDelegate extends SwipeBackFragment {
/*
* Unbinder 是黃油刀的一個類型
* */
private Unbinder mUnbinder=null;
public abstract void onBindView(@Nullable Bundle savedInstanceState,View rootView);
/*
* 下面是寫框架的技巧
* */
public abstract Object setLayout();
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView=null;
//那麼 現在就要開始我們的框架了!!!
if (setLayout() instanceof Integer){ //如果返回的是setLayout的id
rootView=inflater.inflate((Integer) setLayout(),container,false);
}else if (setLayout() instanceof View){
rootView=(View) setLayout();
}
if (rootView!=null){
mUnbinder= ButterKnife.bind(this,rootView);
onBindView(savedInstanceState,rootView);
}
return rootView;
}
@Override
public void onDestroyView() {
super.onDestroyView();
if (mUnbinder!=null){
mUnbinder.unbind(); //解除綁定
}
}
}
2、package com.lsh.fastec.ExanpleDelegate
/**
* Created by liusihui on 2019/11/05
* 模塊功能:
**/
package com.lsh.fastec;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.Nullable;
import com.lsh.latte_core.delegates.LatteDelegate;
public class ExanpleDelegate extends LatteDelegate {
@Override
public void onBindView(@Nullable Bundle savedInstanceState, View rootView) {
}
@Override
public Object setLayout() {
return R.layout.delegate_example;
}
}
3、ExampleActivity
package com.lsh.fastec;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.lsh.latte_core.activities.ProxyActivity;
import com.lsh.latte_core.delegates.LatteDelegate;
public class ExampleActivity extends ProxyActivity {
@Override
public LatteDelegate setRootDelegate() {
return new ExanpleDelegate();
}
}
4、delegate_example.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:text="example delegate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
運行結果: