Android伍什小随笔(二)- 更新中
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)題。
- 上一篇: vue.js将一个对象的所有属性作为pr
- 下一篇: android sina oauth2.