日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android伍什小随笔(二)- 更新中

發(fā)布時(shí)間:2025/3/21 Android 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android伍什小随笔(二)- 更新中 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.單例模式

https://www.cnblogs.com/Ycheng/p/7197751.html

作用:保證在Java應(yīng)用程序中,一個(gè)類(lèi)class只有一個(gè)實(shí)例存在;而且可以節(jié)省內(nèi)存,因?yàn)樗拗屏藢?shí)例的個(gè)數(shù),有利于垃圾回收

1.餓漢模式

一開(kāi)始的時(shí)候就進(jìn)行了實(shí)例化,無(wú)論你到底用到與否,在類(lèi)加載的時(shí)候就立即創(chuàng)建對(duì)象

【注意:】與 “懶加載”進(jìn)行類(lèi)比

private static TaskGoApplication instance; 復(fù)制代碼

2.懶漢模式

等到需要使用的時(shí)候才進(jìn)行創(chuàng)建

3.弊端--進(jìn)程同步Bug-synchronized同步鎖

一個(gè)單例模式創(chuàng)建的對(duì)象是可以同時(shí)被多個(gè)線程處理的,如果一個(gè)對(duì)象被多個(gè)線程同時(shí)處理的話,就有可能出現(xiàn)線程同步問(wèn)題。

解決方法:synchronized 同步鎖

http://blog.51cto.com/lavasoft/99155

2.“確認(rèn)”Button 界面中靠右且有一定距離

android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginRight="11dp" 復(fù)制代碼

3.文字覆蓋于按鈕之下

在位置布局上進(jìn)行設(shè)置

4.讓一段文字豎直方向上居中,使用gravity 而不是用layout_gravity

android:gravity="center_vertical" 復(fù)制代碼

5.一個(gè)有生命的列表

以Information通知界面為例

1.InformationFragmrnt

public class InformFragment extends BasePresenterFragment implements InformationItemListener, SwipeRefreshLayout.OnRefreshListener 復(fù)制代碼

自動(dòng)重寫(xiě)下面這些方法

/*** SwipeRefreshLayout接口中的方法*/@Overridepublic void onRefresh() {}/*** InforItemListener接口中的方法*點(diǎn)擊用戶頭像顯示用戶詳細(xì)信息,點(diǎn)擊確認(rèn)按鈕觸發(fā)其他事件* @param position*/@Overridepublic void onClickPicture(int position) {}@Overridepublic void onClickSure(int position) {}@Overrideprotected BaseContract.Presenter initPresenter() {return null;}/*** BasePresenterFragment中的方法** @return*/@Overrideprotected int getLayoutId() {return R.layout.fragment_information;}@Overrideprotected void initVariable() {}@Overrideprotected void initView() {}@Overrideprotected void loadData() {}/*** generate-Bind自動(dòng)建立的方法* @param inflater* @param container* @param savedInstanceState* @return*/@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {// TODO: inflate a fragment viewView rootView = super.onCreateView(inflater, container, savedInstanceState);unbinder = ButterKnife.bind(this, rootView);return rootView;}@Overridepublic void onDestroyView() {super.onDestroyView();unbinder.unbind();} 復(fù)制代碼

2.InformationItemListener

public interface InformationItemListener {/*** 點(diǎn)擊頭像事件* @param position*/void onClickPicture(int position);/*** 點(diǎn)擊確認(rèn)按鈕事件* @param position*/void onClickSure(int position); } 復(fù)制代碼

3.R.layout.fragment_information

4.InformationModel

public class InformationModel {public InformationModel(String pictureUrl,String receiveName,String releaseName){this.pictureUrl=pictureUrl;this.receiveName=receiveName;this.releaseName=releaseName;}/*** 頭像相關(guān)*/private String pictureUrl;public String getPictureUrl() {return pictureUrl;}public void setPictureUrl(String pictureUrl) {this.pictureUrl = pictureUrl;}/*** 送貨人相關(guān)* @return*/public String getReceiveName() {return receiveName;}public void setReceiveName(String receiveName) {this.receiveName = receiveName;}private String receiveName;/*** 發(fā)布者相關(guān)* @return*/public String getReleaseName() {return releaseName;}public void setReleaseName(String releaseName) {this.releaseName = releaseName;}private String releaseName;} 復(fù)制代碼

5.InformationListRecAdapter

自動(dòng)響應(yīng):

public class InformationListRecAdapter extends BaseRecyclerViewAdapter<InformationModel> {public InformationListRecAdapter(Context context, List<InformationModel> informationModels) {super(context, informationModels);}@Overridepublic BaseViewHolder<InformationModel> onCreateViewHolder(ViewGroup parent, int viewType) {return null;} } 復(fù)制代碼

補(bǔ)充:內(nèi)部類(lèi)ItemHolder

class ItemHolder extends BaseViewHolder<InformationModel> implements View.OnClickListener 復(fù)制代碼

6.多線程

Java中實(shí)現(xiàn)多線程有兩種途徑:繼承Thread類(lèi)活著實(shí)現(xiàn)Runnable接口

1.Thread

使用Thread的時(shí)候只需要new一個(gè)實(shí)力出來(lái),調(diào)用start()方法即可以啟動(dòng)一個(gè)線程

Thread Test = new Thread(); Test.start(); 復(fù)制代碼

2.Runnable

使用Runnable的時(shí)候需要先new一個(gè)繼承Runnable的實(shí)例,之后用子類(lèi)Thread調(diào)用

Test impelements Runnable Test t = new Test(); Thread test = new Thread(t); 復(fù)制代碼

使用Runnable定義的子類(lèi)中沒(méi)有start()方法,只有Thread類(lèi)中才有

3. 例題

需要分別打印出a與b各10次,并且每打印一次a睡1秒,打印一次b睡2秒。 可以在run方法外面定義String word與int time. 之后用

Thread t1 = new Thread();

Thread t2 = new Thread();

t1.word = "a"

t1.time = 1000

t2.Word = "b"

t2.time = 2000

t1.start();

t2.start();

此處需要注意??新建一個(gè)project用于測(cè)試Runnable不是一個(gè)簡(jiǎn)單的Java編譯器,你需要讓這個(gè)inflater能夠找到啟動(dòng)哪一個(gè)具體的Activity,而不是自己zz的取名一個(gè)“MainActivity”的類(lèi)......呵呵呵-----所以需要 把之前想要實(shí)現(xiàn)的main里面的方法,轉(zhuǎn)換為一個(gè)OnCreat()里面的一個(gè) initXXX

7.實(shí)現(xiàn)點(diǎn)擊確認(rèn)按鈕病吧這條item刪除,然后獲取相對(duì)應(yīng)的id

還是以通知界面為例子

1.InformFragment.java實(shí)現(xiàn)InformationItemListener.java自動(dòng)@Override里的方法

public class InformFragment implements InformationItemListener{....} 復(fù)制代碼

2.InformationItemListener.java-監(jiān)聽(tīng)器,監(jiān)聽(tīng)事件的發(fā)生

3.InformationListRecAdapter-適配器,ItemHolder在此定義-在此一定將每一條item的position進(jìn)行設(shè)置,對(duì),源頭就在這里,然后重返Fragment中的點(diǎn)擊函數(shù)里面,將 會(huì)發(fā)生的事情寫(xiě)進(jìn)去

8.對(duì)輸入的密碼進(jìn)行隱藏設(shè)置

android:inputType="textPassword" 復(fù)制代碼

9.設(shè)置按鈕的可點(diǎn)擊事件

mbtnLogin.setClickable(true); 復(fù)制代碼

10.onLoginFailed(...)與onWriteFailed(...)

登錄界面關(guān)于View的接口回調(diào)方法需注意:“輸入密碼錯(cuò)誤“與”輸入格式不正確“is different

  • 輸入的格式不正確:是指在Presenter驗(yàn)證數(shù)據(jù)是否正確的isDataTrue()里關(guān)于輸入的賬號(hào)為空、正則表達(dá)式要起u、密碼長(zhǎng)度限制:過(guò)長(zhǎng)或者過(guò)短 的判斷
  • 輸入密碼錯(cuò)誤:是指 經(jīng)過(guò)網(wǎng)絡(luò)請(qǐng)求過(guò)后 賬號(hào)密碼核對(duì)后有差異

因?yàn)槲覀兿胍獏^(qū)分這兩種狀態(tài),是因?yàn)槿绻斎氲馁~號(hào)正確,但是密碼錯(cuò)誤,當(dāng)我們?cè)俅屋斎胝_密碼的時(shí)候,“登錄”按鈕變成了不可點(diǎn)擊的狀態(tài),即使密碼正確仍舊進(jìn)入不了主界面

(因?yàn)閕sDatatrue判斷的是沒(méi)問(wèn)題的,滿足了賬號(hào)密碼的位數(shù),也滿足了正則表達(dá)式子,button的點(diǎn)擊設(shè)置回不去true,所以我們還需要onLoginFailed(...)方法重新將mbtnLogin.setClickable(true);)

11.解決同時(shí)同步多個(gè)線程

針對(duì)重復(fù)多次快速點(diǎn)登錄按鈕出現(xiàn)重復(fù)出現(xiàn)進(jìn)入MainActivity界面的問(wèn)題學(xué)習(xí)

大體上的思路?:


異步線程和UI線程

凡是在這里面寫(xiě)的都是同步異步線程?:

能看到的都是UI線程,比如點(diǎn)擊一個(gè) button實(shí)現(xiàn)界面Activity之間的跳轉(zhuǎn)......


12.在Presenter數(shù)據(jù)交換的過(guò)程中除了success方法還需要的fail方法在哪?

宏宇封裝的底層中是?這樣:

接下來(lái)我們?cè)诮涌谥羞@樣使用

但注意??,邏輯方面的考慮決定了我們把方法放在底層的Override中實(shí)現(xiàn)

13.Call與Observable

注釋部分是用RxJava,未注釋部分是用原始的網(wǎng)絡(luò)請(qǐng)求

【小注意??】

總結(jié)

以上是生活随笔為你收集整理的Android伍什小随笔(二)- 更新中的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。