摘要:一不小心隔了大半年沒有寫博客了,這大半年從一個小菜雞變成了一個大菜雞。。。
一不小心隔了大半年沒有寫博客了,這大半年從一個小菜雞變成了一個大(pang)菜雞。。。好吧,進入正題吧
Q:MainActivity跳到TargetActivity時附帶數(shù)據(jù)要怎么做?
A:不就是intent附帶數(shù)據(jù)嗎?或者sp/文件存一下等等方式....
Q:那如果是沒有實現(xiàn)序列化的數(shù)據(jù)呢?
A:序列化一下唄...
Q:業(yè)務(wù)原因/歷史原因....這個Bean類要實現(xiàn)序列化的話牽扯到太多東西了,改動成本太大,例如:Bean類里面有Data類,Data類里面又有Other類........這樣的問題
A:..???..???...????!!!!!??!
開始埋頭苦想這埋的雷夠巧妙啊,不過難不倒我,這個靈機一動動~誒,我可以這樣做:
在跳轉(zhuǎn)的時候,先用一個靜態(tài)變量引用數(shù)據(jù),等TargetActivity起來的時候,再把靜態(tài)變量置為null,哎呀,一不小心還注意到了要避免內(nèi)存泄漏,太棒了!
public class TargetActivity extends AppCompatActivity { // 臨時承載數(shù)據(jù) private static Bean sBean; // activity起來的時候真正引用到數(shù)據(jù) private Bean mBean; /** * 啟動TargetActivity必須統(tǒng)一走這個方法 * @param context c * @param bean bean */ public static void start(Context context, Bean bean) { Intent starter = new Intent(context, TargetActivity.class); // 靜態(tài)變量先拿著 sBean = bean; context.startActivity(starter); } { // 成員變量拿到引用 mBean = sBean; // 靜態(tài)變量置空,防止內(nèi)存泄漏 sBean = null; } @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_target); Log.i("LiuZh", "onCreate: " + mBean.name + " " + mBean.age); } }
總感覺這種拍腦袋就搞出來的騷操作有點不太對勁啊
對了!如果有兩個地方依次相接調(diào)用TargetActivity.start(Context,Bean)方法,第一個start調(diào)用還沒開始創(chuàng)建activity呢,第二個start就把sBean重新賦值了,那兩個activity就拿到了同一個數(shù)據(jù).....不行,這樣就亂了,得規(guī)避一下這問題---(至于有沒有允許啟動多個相同activity的需求,反正我有....也總會有的)
這樣的話,我可以把start方法鎖住,然后執(zhí)行完了sBean = null;這個語句再解鎖?
那要怎么寫呢,那就給start方法加個synchronized吧,startActivity語句走完就阻塞住,等activity起來拿到數(shù)據(jù)的時候就解阻塞,好像可以
接下來就是,要怎么阻塞呢?而且阻塞的話千萬不能在主線程,也就意味著我需要在子線程內(nèi)鎖代碼塊,在子線程內(nèi)阻塞。這樣的話,就在子線程用一個while(flag)吧,activity拿完數(shù)據(jù)就修改flag通知一下,哦了,啪啪就是敲
public class TargetActivity extends AppCompatActivity { // 臨時承載數(shù)據(jù) private static Bean sBean; // activity起來的時候真正引用到數(shù)據(jù) private Bean mBean; private static boolean sNextStartTaskFlag = false; /** * 啟動TargetActivity必須統(tǒng)一走這個方法 * * @param context c * @param bean bean */ public static void start(final Context context, final Bean bean) { new Thread() { @Override public void run() { super.run(); synchronized (TargetActivity.class) { sNextStartTaskFlag = false; Intent starter = new Intent(context, TargetActivity.class); // 靜態(tài)變量先拿著 sBean = bean; context.startActivity(starter); // 阻塞住 while (!sNextStartTaskFlag) ;// do nothing } } }.start(); } { // 成員變量拿到引用 mBean = sBean; // 靜態(tài)變量置空,防止內(nèi)存泄漏 sBean = null; // 我ok了, 下一個start可以走了 sNextStartTaskFlag = true; } @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_target); Log.i("LiuZh", "onCreate: " + mBean.name + " " + mBean.age); } }
得,這樣應(yīng)該沒啥問題了,走你
MainActivity布局
MainActivity
public class MainActivity extends AppCompatActivity { private Activity mContext; private Bean mBean = new Bean(); { mContext = this; mBean.name = "LiuZh"; mBean.age = 22; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void startTargetActivity(View view) { TargetActivity.start(mContext, mBean); } }
走你
哦喲,好像還挺不錯的,好,作為一個有追求的小碼渣,還是來自測一下吧,用多個線程來瘋狂調(diào)用一下的start方法:
public void startTargetActivity(View view) { new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 2; i++) { Bean bean = new Bean(); bean.name = "thread_1_LiuZh_" + i; bean.age = i; TargetActivity.start(mContext, bean); Log.i("LiuZh", "Thread_1: " + i); } } }).start(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 2; i++) { Bean bean = new Bean(); bean.name = "thread_2_LiuZh_" + i; bean.age = i; TargetActivity.start(mContext, bean); Log.i("LiuZh", "Thread_2: " + i); } } }).start(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 2; i++) { Bean bean = new Bean(); bean.name = "thread_3_LiuZh_" + i; bean.age = i; TargetActivity.start(mContext, bean); Log.i("LiuZh", "Thread_3: " + i); } } }).start(); }
走你
哦了,從Log看起來沒問題了,看看是不是有6個activity起來了吧,看模擬器去吧
啥?圖?
沒圖!自個跑一遍吧
結(jié)語更多內(nèi)容歡迎訪問我的主頁或我的博客
覺得本文/本Demo對你有所幫助,請不要忘了點一下文末的"?"讓他變成"?"
文中有不妥/錯誤之處,還請見諒并指出
學(xué)習(xí)就是耐住寂寞不斷踩坑,多動手敲就能有更多的知識經(jīng)驗和肩椎脊柱受損T_T
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/68423.html
摘要:具體用法其中表示數(shù)組元素的值,表示數(shù)組元素的下標,表示包含該元素的數(shù)組。這里采用隨機函數(shù)來獲取數(shù)組的下標,函數(shù)是獲取之間的數(shù),函數(shù)是向下取整,這樣就可以隨機獲取相應(yīng)的下標數(shù)。小程序中的模板就很好地幫我們解決了這個問題,并通過屬性來實現(xiàn)調(diào)用。 在微信小程序的開發(fā)過程中,當你想要實現(xiàn)不同頁面間的數(shù)據(jù)綁定,卻為此抓耳饒腮時,不妨讓微信小程序與filter 來一場完美的邂逅,相信會給你帶來別樣...
摘要:原文地址前言起源組件化方案分析業(yè)務(wù)組件的劃分和代碼隔離路由框架基礎(chǔ)庫的優(yōu)勢簡介什么是組件化為什么要組件化分析現(xiàn)有的組件化方案如何選擇組件化方案組件化方案描述架構(gòu)圖一覽架構(gòu)圖詳解宿主層業(yè)務(wù)層業(yè)務(wù)模塊的拆分基礎(chǔ)層核心基礎(chǔ)業(yè)務(wù)公共服務(wù)基礎(chǔ)組件其他 原文地址: https://www.jianshu.com/p/f67... 0 前言 0.1 起源 0.2 組件化方案分析 0.2....
摘要:的控制又來控制一個棧和其狀態(tài)。但是當變化發(fā)生的時候,將會有一個回調(diào)函數(shù)被執(zhí)行。。前一個仍然保留在返回棧當中,但會處于停止狀態(tài)。 接下來根據(jù)自己的平時的學(xué)習(xí)和自己最近要讀的兩本書《android開發(fā)藝術(shù)探索》和《android群英傳》來梳理記錄下自己的學(xué)習(xí)過程和對于遇到問題如何處理解決,還有將會陸續(xù)下一些有關(guān)關(guān)于如何將Java代碼寫的更優(yōu)雅的,結(jié)合自己讀過的書來做個記錄整理型的系列博客。...
閱讀 3330·2021-09-09 11:39
閱讀 1247·2021-09-09 09:33
閱讀 1147·2019-08-30 15:43
閱讀 561·2019-08-29 14:08
閱讀 1744·2019-08-26 13:49
閱讀 2393·2019-08-26 10:09
閱讀 1561·2019-08-23 17:13
閱讀 2301·2019-08-23 12:57