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