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