/* M式編程@小目標 */
### M式編程規(guī)范
步驟:1.理清需求 2.設計數(shù)據(jù)結構和算法 3.對算法進行M化.
& 設計數(shù)據(jù)結構包括類的設計枫浙,數(shù)據(jù)庫的設計,接口的設計等甥桂;
& 算法是解決問題的各種策略,可借助于數(shù)學等各學科知識圣拄;
& 代碼要求:函數(shù)粒度不超過20行,高內聚穆刻,低耦合始花。
=======================================================
### Android Studio編譯優(yōu)化
$ studio.vmoptions
-Xms512m
-Xmx4096m
-XX:MaxPermSize=2048m
-XX:+HeapDumpOnOutOfMemoryError
-Dfile.encoding=UTF-8
$ gradle.properties
#開啟守護進程
org.gradle.damen=true
##開啟并行編譯
org.gradle.parallel=true
##啟用新的孵化模式
org.gradle.configureondemand=true
##配置編譯時的虛擬機大小
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
$ 編譯設置項
### 旋轉動畫
RotateAnimation ra = new RotateAnimation(
0f, -180f, // 開始, 結束的角度, 逆時針
Animation.RELATIVE_TO_SELF, 0.5f,? // 相對的x坐標點(指定旋轉中心x值)
Animation.RELATIVE_TO_SELF, 1.0f); // 相對的y坐標點(指定旋轉中心y值)
ra.setDuration(500);
ra.setFillAfter(true); // 設置動畫停留在結束位置
ra.setStartOffset(delay); // 設置動畫開始延時
ra.setAnimationListener(new MyAnimationListener()); // 添加監(jiān)聽
layout.startAnimation(ra);
### 文件操作
// 保存數(shù)據(jù)
File file = new File("/data/data/com.itheima.login/info.txt");
FileOutputStream fos = new FileOutputStream(file);
String info = qq + "##"+ pwd;
fos.write(info.getBytes());
fos.close();
// 讀取數(shù)據(jù)
File file = new File("/data/data/com.itheima.login/files/info.txt");
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String info = br.readLine();
### Android Studio運行加速和優(yōu)化
& 修改此文件: studio64.vmoptions
-Xms2048m??
-Xmx2048m??
-XX:MaxPermSize=2048m??
-XX:ReservedCodeCacheSize=1024m?
### MVP模式詳解
MVP(Model-View-Presenter,模型-視圖-表示器)模式則是由IBM開發(fā)出來的一個針對C++和Java的編程模型趋惨,大概出現(xiàn)于2000年鸟顺,是MVC模式的一個變種,主要用來隔離UI器虾、UI邏輯和業(yè)務邏輯讯嫂、數(shù)據(jù)。也就是說兆沙,MVP 是從經(jīng)典的模式MVC演變而來欧芽,它們的基本思想有相通的地方:Controller/Presenter負責邏輯的處理,Model提供數(shù)據(jù)葛圃,View負責顯示千扔。
(1) View :負責繪制UI元素憎妙、與用戶進行交互(在Android中體現(xiàn)為Activity);
(2) View interface :需要View實現(xiàn)的接口,View通過View interface與Presenter進行交互曲楚,降低耦合厘唾,方便進行單元測試;
(3) Model :負責存儲、檢索龙誊、操縱數(shù)據(jù)(有時也實現(xiàn)一個Model interface用來降低耦合);
(4) Presenter :作為View與Model交互的中間紐帶抚垃,處理與用戶交互的負責邏輯。
### EventBus
EventBus是由greenrobot 組織貢獻的一個Android事件發(fā)布/訂閱輕量級框架趟大。EventBus是一個Android端優(yōu)化的publish/subscribe消息總線鹤树,簡化了應用程序內各組件間、組件與后臺線程間的通信逊朽。比如請求網(wǎng)絡魂迄,等網(wǎng)絡返回時通過Handler或Broadcast通知UI,兩個Fragment之間需要通過Listener通信惋耙,這些需求都可以通過EventBus實現(xiàn)捣炬。
發(fā)布消息:EventBus.getDefault().post(new MessageEvent(“name”,”password”));
接收消息:可以有四種線程模型選擇
@Subscribe(threadMode = ThreadMode.MAIN)
public void messageEventBus(MessageEvent event){
? ? tv_result.setText("name:"+event.name+" passwrod:"+event.password);
}
### RxAndroid教程
RxJava最核心的兩個東西是Observables(被觀察者,事件源)和Subscribers(訂閱者)绽榛。Observables發(fā)出一系列事件湿酸,Subscribers處理這些事件。這里的事件可以是任何你感興趣的東西灭美,觸摸事件推溃,web接口調用返回的數(shù)據(jù)等等。
在觀察者模式中届腐,必須實現(xiàn)兩個關鍵的 RxJava 接口:觀察者 Observer 和被觀察者 Observable铁坎。當被觀察者的狀態(tài)改變,所有訂閱了的觀察者對象都會被通知犁苏。
Observable 接口有一個 subscribe() 方法硬萍,每個觀察者調用這個方法來訂閱通知。?
在 Observer 接口中有 3 個方法會被 Observable 調用:
onNext(T value) 方法:提供一個類型為 T 的新對象給觀察者
onComplete() 方法:當被觀察者發(fā)送完這個對象之后通知給觀察者围详。
onError(Throwable e) 方法:通知觀察者被觀察者發(fā)生了一個錯誤朴乖。
### Otto使用姿勢
Android事件總線,使用這個庫可實現(xiàn)組件之間的通信.
Bus?– 管理注冊、注銷和發(fā)布事件
@Produce?– 標記該方法是生產者助赞,產生的事件內容為該方法的返回值
@Subscribe?– 標記該方法是訂閱者买羞,表示訂閱了一個事件,方法需要修飾符為public雹食,而區(qū)分不同的訂閱者是通過方法的參數(shù)來區(qū)分的畜普,且訂閱了某事件的所有訂閱者都可以收到該事件
register(Object obj)?– 注冊,訂閱事件前都需要注冊
unregister(Object obj)?– 注銷群叶,放棄之前所有事件的訂閱
post(Object event)?– 發(fā)布一個事件吃挑,這個事件會被所有標記了@Subscribe注解的方法獲得
### GreenDAO的使用
GreenDAO是一個開源的安卓ORM框架钝荡,能夠使SQLite數(shù)據(jù)庫的開發(fā)再次變得有趣。它減輕開發(fā)人員處理低級數(shù)據(jù)庫需求儒鹿,同時節(jié)省開發(fā)時間。 SQLite是一個令人敬畏的內嵌的關系數(shù)據(jù)庫几晤,編寫SQL和解析查詢結果是相當乏味和耗時的任務约炎。通過將Java對象映射到數(shù)據(jù)庫表(稱為ORM,“對象/關系映射”)蟹瘾,GreenDAO可以將它們從這些映射中釋放出來圾浅,這樣,您可以使用簡單的面向對象的API來存儲憾朴,更新狸捕,刪除和查詢數(shù)據(jù)庫。
簡單的講众雷,GreenDAO 是一個將對象映射到 SQLite 數(shù)據(jù)庫中的輕量且快速的 ORM 解決方案灸拍。
關鍵步驟:創(chuàng)建好@Entity注解的實體類后,在Gradle中找到greendao<腳本>并且build,程序將會對實體代碼進行標準化.
會自動創(chuàng)建下面三個類在你指定的包下面: <真幾巴強大,簡直受不了!!!>
DaoMaster: 定義了數(shù)據(jù)庫創(chuàng)建和操作的方法。
DaoSession: 提供用于訪問數(shù)據(jù)庫的 DAO 類砾省。
UserDao: 封裝用戶表鸡岗,并為其定義查詢等操作。
& 插入一條數(shù)據(jù)
mDaoSession = new DaoMaster(new DaoMaster.DevOpenHelper(this,DATABASE_NAME).getWritableDb()).newSession();
UserBean userBean = new UserBean(1L,"cmc","123456",24);
mDaoSession.getUserBeanDao().insert(userBean);
### FastJson操作數(shù)據(jù)
//將對象轉為json串7 String json=JSON.toJSONString(student);8 Log.e("ObjectToJson",json);
//將json轉為對象 參數(shù)1json? 參數(shù)2對象類型2 Student student=JSON.parseObject(json,Student.class);
只有一句話 就完成了 簡單到爆有沒有 ? 感謝馬云粑粑1嘈帧P浴!
### okhttp使用指南
在使用OKHttp之前狠鸳,首先要先了解如下幾個比較核心的類:
OkHttpClient:客戶端對象
Request:訪問請求揣苏,Post請求中需要包含RequestBody
RequestBody:請求數(shù)據(jù),在Post請求中用到
Response:即網(wǎng)絡請求的響應結果
MediaType:數(shù)據(jù)類型件舵,用來表明數(shù)據(jù)是json卸察,image,pdf等一系列格式
client.newCall(request).execute():同步的請求方法
client.newCall(request).enqueue(Callback callBack):異步的請求方法铅祸,但Callback是執(zhí)行在子線程中的蛾派,因此不能在此進行UI更新操作
public void okhttp_get(){
? ? final Request request = new Request.Builder().url("http://www.baidu.com").get().build();
? ? okHttpClient.newCall(request).enqueue(new Callback() {
? ? ? ? @Override
? ? ? ? public void onFailure(Call call, IOException e) {
? ? ? ? ? ? Log.e("okhttp-GET","網(wǎng)絡請求失敗");
? ? ? ? }
? ? ? ? @Override
? ? ? ? public void onResponse(Call call, Response response) throws IOException {
? ? ? ? ? ? Log.i("success",response.body().toString());
? ? ? ? }
? ? });
}
### Android Service使用詳解
Service是Android系統(tǒng)中的四大組件之一,主要有兩個應用場景:后臺運行和跨進程訪問个少。Service可以在后臺執(zhí)行長時間運行操作而不提供用戶界面洪乍,除非系統(tǒng)必須回收內存資源,否則系統(tǒng)不會停止或銷毀服務夜焦。服務可由其他應用組件啟動壳澳,而且即使用戶切換到其他應用,服務仍將在后臺繼續(xù)運行茫经。 此外巷波,組件可以綁定到服務萎津,以與之進行交互,甚至是執(zhí)行進程間通信 (IPC);需要注意的是抹镊,Service是在主線程里執(zhí)行操作的锉屈,可能會因為執(zhí)行耗時操作而導致ANR.
其他組件調用startService()方法啟動一個Service。
其他組件調用bindService()方法綁定一個Service垮耳。
### Broadcast使用的一般步驟
1)實現(xiàn)一個廣播接收器
public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();? } }
2)注冊廣播
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
myBroadcastReceiver = new MyBroadcastReceiver();
registerReceiver(myBroadcastReceiver, intentFilter);
3)發(fā)送廣播
Intent intent = new Intent("android.net.conn.CONNECTIVITY_CHANGE");
sendBroadcast(intent); // 發(fā)送廣播
### Butter Knife的使用
& Butter Knife常用于View控件的綁定.
class ExampleActivity extends Activity {
? @BindView(R.id.user) EditText username;
? @BindView(R.id.pass) EditText password;
? @BindString(R.string.login_error) String loginErrorMessage;
? @OnClick(R.id.submit) void submit() {
? ? // TODO call server...? }
? @Override public void onCreate(Bundle savedInstanceState) {
? ? super.onCreate(savedInstanceState);
? ? setContentView(R.layout.simple_activity);
? ? ButterKnife.bind(this);
? ? // TODO Use fields...? }
}
### RecyclerView的使用
如果你想使用RecyclerView颈渊,需要做以下操作:
RecyclerView.Adapter- 處理數(shù)據(jù)集合并負責綁定視圖
ViewHolder- 持有所有的用于綁定數(shù)據(jù)或者需要操作的View
LayoutManager- 負責擺放視圖等相關操作
ItemDecoration- 負責繪制Item附近的分割線
ItemAnimator- 為Item的一般操作添加動畫效果,如终佛,增刪條目等
可以看到對RecylerView的設置過程俊嗽,比ListView要復雜一些,這也是RecylerView高度解耦的表現(xiàn)铃彰,雖然代碼抒寫上有點復雜绍豁,但它的擴展性是極高的。在了解了RecyclerView的一些控制之后牙捉,緊接著來看看它的Adapter的寫法竹揍,RecyclerView的Adapter與ListView的Adapter還是有點區(qū)別的,RecyclerView.Adapter邪铲,需要實現(xiàn)3個方法:
①onCreateViewHolder()
? ? 這個方法主要生成為每個Item inflater出一個View鬼佣,但是該方法返回的是一個ViewHolder。該方法把View直接封裝在ViewHolder中霜浴,然后我們面向的是ViewHolder這個實例晶衷,當然這個ViewHolder需要我們自己去編寫。直接省去了當初的convertView.setTag(holder)和convertView.getTag()這些繁瑣的步驟阴孟。
②onBindViewHolder()
? ? ?這個方法主要用于適配渲染數(shù)據(jù)到View中晌纫。方法提供給你了一個viewHolder,而不是原來的convertView永丝。
③getItemCount()
? ? ? 這個方法就類似于BaseAdapter的getCount方法了锹漱,即總共有多少個條目。
### adb指令集
$ adb devices? # 列舉當前連接的調試設備
$ adb logcat -c? # 清除手機的log buffer
$ adb install ~/Downloads/nzcp5.apk? # 安裝apk
$ adb push ~/Desktop/temp.trace /sdcard/data/ # 拷貝本地文件到調試設備
$ adb kill-server? # 常與adb start-server聯(lián)用
$ adb shell? # 進入調試設備的Shell環(huán)境
$ adb tcpip 5555 # 開啟遠程調試模式
$ adb connect? # 通過wifi進行調試
$ adb shell am start # 根據(jù)Intent指向啟動Activity
### Android常用命令行
$ ps -ef | grep java # 查找指定進程
$ kill -9 進程號 # 徹底殺死某個進程
$ tail -100f catalina.out # 查看倒數(shù)100行數(shù)據(jù),tail是查閱正在改變的日志文件
$ ssh root@192.168.61.10 # 遠程登錄
$ java -jar test.jar? # 執(zhí)行jar包
$ curl -I http://www.baidu.com # http請求命令行工具,curl -X GET url,GET請求
$ scp -r root@IP:/home/nzcp.apk? /root/Desktop # scp從遠端拷貝文件到本地
========================== 附錄 ================================
& 抓緊時間積累經(jīng)驗,將任務劃分為一個一個的小目標來完成.經(jīng)驗最重要!!!
*** 常用的第三方框架 ***
implementation 'com.android.support:recyclerview-v7:26.1.0'
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
implementation 'com.squareup.okhttp3:okhttp:3.9.1'
implementation 'com.alibaba:fastjson:1.1.68.android'
implementation 'org.greenrobot:greendao:3.2.2'
implementation 'org.greenrobot:eventbus:3.1.1'