教你用一個Json做一個App,字節跳動面試分享

Android_devp 2021-09-18 05:19:52 阅读数:168

教你用 教你 json app 分享
 "width": "100",
"height": "100",
"url": "https://bugly.qq.com/v2/image?id=2c06cba9-7d27-4f1c-8b0d-b932c33deaf3"
}

這個就可以生成一個ImageView。如果更細化,還可以指定margin和padding,腦補css。
同理,如果是容器布局,可以擴展一下,加一個子類集合:

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
{
"name": "VLL",
"children": [
{
"name": "TV"
},
{
"name": "TV"
},
{
"name": "TV"
}
]
}

"VLL"可以提前協議好是Vertical的LinearLayout,children就是子View的集合。
有了控件還需要一個頁面承載,頁面也能看成View,但是頁面需要有更多的功能,全放View會導致View的屬性過多,所以也能做一層抽象,

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
{
"contextName": "home",
"layout": {
}
}

"contextName"能唯一標記一個頁面,比如登錄頁面可以標記為"login","layout"實質就是一個View,字段和上面的基礎控件一致。
有了上面的規則,現在可以嘗試做一個有三個文本的首頁:

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
{
"contextName": "home",
"layout": {
"name": "VLL",
"children": [
{
"name": "TV",
"content": "打開頁面",
"color": "#333333",
"size": "16"
},
{
"name": "TV",
"content": "彈出Toast",
"color": "#333333",
"size": "16"
},
{
"name": "TV",
"content": "請求網絡",
"color": "#333333",
"size": "16"
}
]
}
}

### 二、 View的響應
第一步已經能自動填充控件了,但是如果真想點擊第二個TextView去彈出一個Toast,怎麼處理呢?可以嘗試在View的數據裏面指定一個動作:

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
{
"name": "TV",
"content": "彈出Toast",
"color": "#333333",
"size": "16",
"action": {
"name": "toast",
"msg": "彈出一下"
}
}

這樣點擊的時候就可以解析出一個Toast的動作。當然Action是需要提前窮舉的,還是前面說的,一個App的動作肯定不是無限的。比如跳轉一個頁面:

  • 1.
  • 2.
  • 3.
{
"name": "TV",
"content": "打開頁面",
"color": "#333333",
"size": "16",
"action": {
"name": "open",
"nextPage": {
"contextName": "detail",
"layout": {}
}
}
}

"nextPage"已經能自動生成第二個頁面了。甚至於,請求也是一個Action:

  • 1.
  • 2.
  • 3.
{
"name": "TV",
"content": "請求網絡",
"color": "#333333",
"size": "16",
"action": {
"name": "request",
"url": "https://xxx.com",
"params": {
"name": "rjp",
"age": "18"
}
}
}

如果你已經封裝了請求,上面的數據已經够去請求一下了,但是請求回來的數據呢?這就是說,有時候Action的動作是有後續動作的,有一種嵌套關系:

  • 1.
  • 2.
  • 3.
{
"name": "TV",
"content": "請求網絡",
"color": "#333333",
"size": "16",
"action": {
"name": "request",
"url": "https://xxx.com",
"params": {
"name": "rjp",
"age": "18"
},
"action": "setData"
}
}

"request"的後續有一個"setData"的動作。這就不好處理了,因為每個頁面的業務數據都是獨特的,數據模型無法統一。所以需要一個中間層,能對後臺下發的數據進行標准化輸出:

  • 1.
  • 2.
  • 3.
public class DataBean {
private String a;
private String b;
private String c;
private String d;
private String e;
private String f;
private String g;
}

也就是說,不管我請求哪個接口,返回的數據永遠是abcdefg,我也不關心字段究竟代錶什麼。
那怎麼知道下發的數據應該填充到哪個控件呢?可以通過給控件設置一個value,來指定需要的數據:

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
{
"name": "TV",
"content": "請求網絡",
"color": "#333333",
"size": "16",
"value": "a",
"action": {
"name": "request",
"url": "https://xxx.com",
"params": {
"name": "rjp",
"age": "18"
},
"action": "setData"
}
}

這樣點擊完請求數據,如果數據裏面帶上了"a": "後臺數據",就將數據填到這個TextView上。填充首先想到的就是遍曆頁面的根View,但是隨著頁面複雜化,非常耗時,可以參考局部刷新的做法,對有value屬性的View進行緩存,只要遍曆緩存集合就行了,非常高效。
### 三、 拼多多
說了這麼多還沒有一個完整的例子,下面一步步來實現。

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
public class PageActivity extends AppCompatActivity implements IPage {
private List<View> viewCache;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_page);
FrameLayout pageContainer = findViewById(R.id.page_container);
Intent intent = getIntent();
if (intent != null && intent.hasExtra("nextPage")) {
String nextPage = intent.getStringExtra("nextPage");
PageBean pageBean = JSONObject.parseObject(nextPage, PageBean.class);
if (pageBean != null) {
viewCache = new ArrayList<>();
pageContainer.addView(LayoutFactory.createView(this, pageBean.getLayout()));
}
}
}
@Override
public Context getContext() {
return this;
}
@Override
public List<View> getViewCache() {
return viewCache;
}
}

創建一個簡單的頁面容器Activity,布局只有一個FrameLayout,從上一個頁面接收json,這個json描述整個Page,當然也可以通過接口請求獲取,測試階段直接從Assets讀取。
上面的關鍵是獲取到json轉成PageBean結構:

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
public class PageBean {
private String contextName;
private ViewBean layout;
public ViewBean getLayout() {
return layout;
}
public void setLayout(ViewBean layout) {
this.layout = layout;
}
public String getContextName() {
return contextName;
}
public void setContextName(String contextName) {
this.contextName = contextName;
}
}

ViewBean:

  • 1.
  • 2.
  • 3.
public class ViewBean {
private String id;

最後

感覺現在好多人都在說什麼安卓快凉了,工作越來越難找了。又是說什麼程序員中年危機啥的,為啥我這年近30的老農根本沒有這種感覺,反倒覺得那些販賣焦慮的都是瞎j8扯談。當然,職業危機意識確實是要有的,但根本沒到那種草木皆兵的地步好嗎?

Android凉了都是弱者的借口和說辭。雖然 Android 沒有前幾年火熱了,已經過去了會四大組件就能找到高薪職比特的時代了。這只能說明 Android 中級以下的崗比特飽和了,現在高級工程師還是比較缺少的,很多高級職比特給的薪資真的特別高(錢多也不一定能找到合適的),所以努力讓自己成為高級工程師才是最重要的。

所以,最後這裏放上我耗時兩個月,將自己8年Android開發的知識筆記整理成的Android開發者必知必會系統學習資料筆記,上述知識點在筆記中都有詳細的解讀,裏面還包含了騰訊、字節跳動、阿裏、百度2019-2021面試真題解析,並且把每個技術點整理成了視頻和PDF(知識脈絡 + 諸多細節)。

 CodeChina開源項目:《Android學習筆記總結+移動架構視頻+大廠面試真題+項目實戰源碼》

教你用一個Json做一個App,字節跳動面試分享_移動開發

以上全套學習筆記面試寶典,吃透一半保你可以吊打面試官,只有自己真正强大了,有核心競爭力,你才有拒絕offer的權力,所以,奮鬥吧!騷年們!千裏之行,始於足下。種下一顆樹最好的時間是十年前,其次,就是現在。

最後,贈與大家一句詩,共勉!

不馳於空想,不騖於虛聲。不忘初心,方得始終。

版权声明:本文为[Android_devp]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210918051952153c.html