ARTS-WEEK1

左耳聽風(fēng)ARTS 100天打卡計劃

(1)Algorithm 每周至少做一個 leetcode 的算法題-為了編程訓(xùn)練和學(xué)習(xí)

(2)Review 每周閱讀并點評至少一篇英文技術(shù)文章-為了學(xué)習(xí)英文,接觸一手知識點

(3)Tip 每周學(xué)習(xí)至少一個技術(shù)技巧-總結(jié)和歸納工作中遇到的知識點

(4)Share? 每周分享一篇有觀點和思考的技術(shù)文章-建立影響力,輸出價值觀

week1(3/18-3/24)

A

三數(shù)之和,復(fù)雜度為O(n2)

private static List<List<Integer>> threeSum(int[] num) {

? ? Arrays.sort(num);

? ? List<List<Integer>> res = new LinkedList<List<Integer>>();

? ? for (int i = 0; i < num.length - 2; i++) {

? ? ? ? if (i == 0 || (i > 0 && num[i] != num[i - 1])) {

? ? ? ? ? ? int lo = i + 1, hi = num.length - 1, sum = 0 - num[i];

? ? ? ? ? ? while (lo < hi) {

? ? ? ? ? ? ? ? if (num[lo] + num[hi] == sum) {

? ? ? ? ? ? ? ? ? ? res.add(Arrays.asList(num[i], num[lo], num[hi]));

? ? ? ? ? ? ? ? ? ? while (lo < hi && num[lo] == num[lo + 1]) lo++;

? ? ? ? ? ? ? ? ? ? while (lo < hi && num[hi] == num[hi - 1]) hi--;

? ? ? ? ? ? ? ? ? ? lo++;

? ? ? ? ? ? ? ? ? ? hi--;

? ? ? ? ? ? ? ? } else if (num[lo] + num[hi] < sum) lo++;

? ? ? ? ? ? ? ? else hi--;

? ? ? ? ? ? }

? ? ? ? }

? ? }

? ? return res;

}

R

https://developer.android.com/topic/libraries/architecture/viewmodel

viewmodel 是被設(shè)計為存儲和管理UI重建時候的數(shù)據(jù),以一種可以感知生命周期的方式. 它允許在配置發(fā)生改變時候(例如屏幕旋轉(zhuǎn))繼續(xù)存在,android framework 管理UI控制器的生命周期,例如activity 和 fragments. 在系統(tǒng)重建UI 控制器的時候存儲的數(shù)據(jù)會丟失,可以使用onSaveInstanceState() 方法來存儲和恢復(fù)數(shù)據(jù)通過bundle 在onCreate()方法里面. 但是這種方式僅僅適用于可以序列化和反序列化的少量數(shù)據(jù),并不使用與大量的數(shù)據(jù),比如說用戶列表和bitmaps.

另外一個問題是UI 控制器需要頻繁的進行異步請求,這需要花費一些時間來返回. UI 控制器需要去管理這些請求,確保在的destory的時候可以clean 他們以避免潛在的內(nèi)存泄露.這種管理需要重建一些對象,浪費一些資源

UI控制器主要的職責(zé)是呈現(xiàn)UI數(shù)據(jù),響應(yīng)用戶的action或者是系統(tǒng)的交互,過多的邏輯在里面會導(dǎo)致該類增多,將數(shù)據(jù)的數(shù)據(jù)分離出來對于view來說

更加高效.

public class MyViewModel extends ViewModel {

? ? private MutableLiveData<List<User>> users;

? ? public LiveData<List<User>> getUsers() {

? ? ? ? if (users == null) {

? ? ? ? ? ? users = new MutableLiveData<List<User>>();

? ? ? ? ? ? loadUsers();

? ? ? ? }

? ? ? ? return users;

? ? }

? ? private void loadUsers() {

? ? ? ? // Do an asynchronous operation to fetch users.

? ? }

}

public class MyActivity extends AppCompatActivity {

? ? public void onCreate(Bundle savedInstanceState) {

? ? ? ? // Create a ViewModel the first time the system calls an activity's onCreate() method.

? ? ? ? // Re-created activities receive the same MyViewModel instance created by the first activity.

? ? ? ? MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);

? ? ? ? model.getUsers().observe(this, users -> {

? ? ? ? ? ? // update UI

? ? ? ? });

? ? }

}

當activity重建的時候 viewmodel 所使用的實例是第一次activity創(chuàng)建的時候的實例.當它銷毀的時候,系統(tǒng)會調(diào)用onCleared()方法去清空資源.

ViewModel絕不能引用視圖耸棒,生命周期或任何可能包含對活動上下文的引用的類雕旨。

生命周期如下圖:


public class SharedViewModel extends ViewModel {

? ? private final MutableLiveData<Item> selected = new MutableLiveData<Item>();

? ? public void select(Item item) {

? ? ? ? selected.setValue(item);

? ? }

? ? public LiveData<Item> getSelected() {

? ? ? ? return selected;

? ? }

}

public class MasterFragment extends Fragment {

? ? private SharedViewModel model;

? ? public void onCreate(Bundle savedInstanceState) {

? ? ? ? super.onCreate(savedInstanceState);

? ? ? ? model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);

? ? ? ? itemSelector.setOnClickListener(item -> {

? ? ? ? ? ? model.select(item);

? ? ? ? });

? ? }

}

public class DetailFragment extends Fragment {

? ? public void onCreate(Bundle savedInstanceState) {

? ? ? ? super.onCreate(savedInstanceState);

? ? ? ? SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);

? ? ? ? model.getSelected().observe(this, { item ->

? ? ? ? ? ?// Update the UI.

? ? ? ? });

? ? }

}

T

android 里面的拖拽的使用

oneView.startDrag(data, new View.DragShadowBuilder(view), view, 0);

使用startDarg來開啟當前view的拖拽,其他所有view都會收到這個view拖拽的通知

其他view的處理

public class TwoView extends View {

? ? public static final String TAG = "dragview";

? ? public TwoView(Context context, @Nullable AttributeSet attrs) {

? ? ? ? super(context, attrs);

? ? }

? ? @Override

? ? public boolean onDragEvent(DragEvent event) {

? ? ? ? boolean result = false;

? ? ? ? switch (event.getAction()) {

? ? ? ? ? ? case DragEvent.ACTION_DRAG_STARTED:

? ? ? ? ? ? ? ? result = true;

? ? ? ? ? ? ? ? Log.d(TAG, " 有view 開始拖拽");

? ? ? ? ? ? ? ? View dragView = (View) event.getLocalState();

? ? ? ? ? ? ? ? dragView.setVisibility(INVISIBLE);

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? case DragEvent.ACTION_DRAG_LOCATION:

? ? ? ? ? ? ? ? Log.i(TAG, "被拖動的View進入當前View后染苛,位置發(fā)生改變!");

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? case DragEvent.ACTION_DROP:

? ? ? ? ? ? ? ? Log.i(TAG, "拖動的View被放入當前View!");

? ? ? ? ? ? ? ? /**

? ? ? ? ? ? ? ? * 在放時交互兩個View的背景。

? ? ? ? ? ? ? ? */

? ? ? ? ? ? ? ? View mDragView = (View) event.getLocalState();

? ? ? ? ? ? ? ? Drawable mDragViewBackgroud = mDragView.getBackground();

? ? ? ? ? ? ? ? mDragView.setBackgroundDrawable(this.getBackground());

? ? ? ? ? ? ? ? this.setBackgroundDrawable(mDragViewBackgroud);

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? case DragEvent.ACTION_DRAG_ENDED: {

? ? ? ? ? ? ? ? View dragView1 = (View) event.getLocalState();

? ? ? ? ? ? ? ? dragView1.setVisibility(VISIBLE);

? ? ? ? ? ? ? ? Log.i(TAG, "拖動結(jié)束!");

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? }

? ? ? ? ? ? case DragEvent.ACTION_DRAG_EXITED: {

? ? ? ? ? ? ? ? Log.i(TAG, "拖動退出!");

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? }

? ? ? ? ? ? default: {

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return result;

? ? }

代碼https://github.com/onebee/milestone/tree/master/dragsample


https://medium.com/androiddevelopers/viewmodels-a-simple-example-ed5ac416317e

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末骗绕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌森逮,老刑警劉巖噪伊,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件簿煌,死亡現(xiàn)場離奇詭異,居然都是意外死亡鉴吹,警方通過查閱死者的電腦和手機姨伟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來豆励,“玉大人夺荒,你說我怎么就攤上這事×颊簦” “怎么了技扼?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嫩痰。 經(jīng)常有香客問我剿吻,道長,這世上最難降的妖魔是什么始赎? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任和橙,我火速辦了婚禮仔燕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘魔招。我一直安慰自己晰搀,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布办斑。 她就那樣靜靜地躺著外恕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乡翅。 梳的紋絲不亂的頭發(fā)上鳞疲,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音蠕蚜,去河邊找鬼尚洽。 笑死,一個胖子當著我的面吹牛靶累,可吹牛的內(nèi)容都是我干的腺毫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼挣柬,長吁一口氣:“原來是場噩夢啊……” “哼潮酒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起邪蛔,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤急黎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后侧到,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勃教,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年床牧,在試婚紗的時候發(fā)現(xiàn)自己被綠了荣回。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡戈咳,死狀恐怖心软,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情著蛙,我是刑警寧澤删铃,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站踏堡,受9級特大地震影響猎唁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜顷蟆,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一诫隅、第九天 我趴在偏房一處隱蔽的房頂上張望腐魂。 院中可真熱鬧,春花似錦逐纬、人聲如沸蛔屹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兔毒。三九已至,卻和暖如春甸箱,著一層夾襖步出監(jiān)牢的瞬間育叁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工芍殖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留豪嗽,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓围小,卻偏偏與公主長得像昵骤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子肯适,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353