Android伍什小随笔(二)- 更新中
1.單例模式
https://www.cnblogs.com/Ycheng/p/7197751.html
作用:保證在Java應用程序中,一個類class只有一個實例存在;而且可以節省內存,因為它限制了實例的個數,有利于垃圾回收
1.餓漢模式
一開始的時候就進行了實例化,無論你到底用到與否,在類加載的時候就立即創建對象
【注意:】與 “懶加載”進行類比
private static TaskGoApplication instance; 復制代碼2.懶漢模式
等到需要使用的時候才進行創建
3.弊端--進程同步Bug-synchronized同步鎖
一個單例模式創建的對象是可以同時被多個線程處理的,如果一個對象被多個線程同時處理的話,就有可能出現線程同步問題。
解決方法:synchronized 同步鎖
http://blog.51cto.com/lavasoft/99155
2.“確認”Button 界面中靠右且有一定距離
android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginRight="11dp" 復制代碼3.文字覆蓋于按鈕之下
在位置布局上進行設置
4.讓一段文字豎直方向上居中,使用gravity 而不是用layout_gravity
android:gravity="center_vertical" 復制代碼5.一個有生命的列表
以Information通知界面為例
1.InformationFragmrnt
public class InformFragment extends BasePresenterFragment implements InformationItemListener, SwipeRefreshLayout.OnRefreshListener 復制代碼自動重寫下面這些方法
/*** SwipeRefreshLayout接口中的方法*/@Overridepublic void onRefresh() {}/*** InforItemListener接口中的方法*點擊用戶頭像顯示用戶詳細信息,點擊確認按鈕觸發其他事件* @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自動建立的方法* @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();} 復制代碼2.InformationItemListener
public interface InformationItemListener {/*** 點擊頭像事件* @param position*/void onClickPicture(int position);/*** 點擊確認按鈕事件* @param position*/void onClickSure(int position); } 復制代碼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;}/*** 頭像相關*/private String pictureUrl;public String getPictureUrl() {return pictureUrl;}public void setPictureUrl(String pictureUrl) {this.pictureUrl = pictureUrl;}/*** 送貨人相關* @return*/public String getReceiveName() {return receiveName;}public void setReceiveName(String receiveName) {this.receiveName = receiveName;}private String receiveName;/*** 發布者相關* @return*/public String getReleaseName() {return releaseName;}public void setReleaseName(String releaseName) {this.releaseName = releaseName;}private String releaseName;} 復制代碼5.InformationListRecAdapter
自動響應:
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;} } 復制代碼補充:內部類ItemHolder
class ItemHolder extends BaseViewHolder<InformationModel> implements View.OnClickListener 復制代碼6.多線程
Java中實現多線程有兩種途徑:繼承Thread類活著實現Runnable接口
1.Thread
使用Thread的時候只需要new一個實力出來,調用start()方法即可以啟動一個線程
Thread Test = new Thread(); Test.start(); 復制代碼2.Runnable
使用Runnable的時候需要先new一個繼承Runnable的實例,之后用子類Thread調用
Test impelements Runnable Test t = new Test(); Thread test = new Thread(t); 復制代碼使用Runnable定義的子類中沒有start()方法,只有Thread類中才有
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();
此處需要注意??新建一個project用于測試Runnable不是一個簡單的Java編譯器,你需要讓這個inflater能夠找到啟動哪一個具體的Activity,而不是自己zz的取名一個“MainActivity”的類......呵呵呵-----所以需要 把之前想要實現的main里面的方法,轉換為一個OnCreat()里面的一個 initXXX
7.實現點擊確認按鈕病吧這條item刪除,然后獲取相對應的id
還是以通知界面為例子
1.InformFragment.java實現InformationItemListener.java自動@Override里的方法
public class InformFragment implements InformationItemListener{....} 復制代碼2.InformationItemListener.java-監聽器,監聽事件的發生
3.InformationListRecAdapter-適配器,ItemHolder在此定義-在此一定將每一條item的position進行設置,對,源頭就在這里,然后重返Fragment中的點擊函數里面,將 會發生的事情寫進去
8.對輸入的密碼進行隱藏設置
android:inputType="textPassword" 復制代碼9.設置按鈕的可點擊事件
mbtnLogin.setClickable(true); 復制代碼10.onLoginFailed(...)與onWriteFailed(...)
登錄界面關于View的接口回調方法需注意:“輸入密碼錯誤“與”輸入格式不正確“is different
- 輸入的格式不正確:是指在Presenter驗證數據是否正確的isDataTrue()里關于輸入的賬號為空、正則表達式要起u、密碼長度限制:過長或者過短 的判斷
- 輸入密碼錯誤:是指 經過網絡請求過后 賬號密碼核對后有差異
因為我們想要區分這兩種狀態,是因為如果輸入的賬號正確,但是密碼錯誤,當我們再次輸入正確密碼的時候,“登錄”按鈕變成了不可點擊的狀態,即使密碼正確仍舊進入不了主界面
(因為isDatatrue判斷的是沒問題的,滿足了賬號密碼的位數,也滿足了正則表達式子,button的點擊設置回不去true,所以我們還需要onLoginFailed(...)方法重新將mbtnLogin.setClickable(true);)
11.解決同時同步多個線程
針對重復多次快速點登錄按鈕出現重復出現進入MainActivity界面的問題學習
大體上的思路?:
異步線程和UI線程
凡是在這里面寫的都是同步異步線程?:
能看到的都是UI線程,比如點擊一個 button實現界面Activity之間的跳轉......
12.在Presenter數據交換的過程中除了success方法還需要的fail方法在哪?
宏宇封裝的底層中是?這樣:
接下來我們在接口中這樣使用
但注意??,邏輯方面的考慮決定了我們把方法放在底層的Override中實現
13.Call與Observable
注釋部分是用RxJava,未注釋部分是用原始的網絡請求
【小注意??】
總結
以上是生活随笔為你收集整理的Android伍什小随笔(二)- 更新中的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue.js将一个对象的所有属性作为pr
- 下一篇: Mac zsh切换bash bash切换