Android,android官網
目錄
自訂兩個View進行畫圖,讓其各自重新整理重繪
我將螢幕分為左右兩部分,並且自訂了繪圖類drawOneView和drawTwoView,它們都繼承View類,其中drawOneView在螢幕左邊顯示,drawTwoView在右邊顯示,在drawOneView中能夠通過invalidate()函數,使其重繪,但是在drawTwoView中就不能通過invalidate()函數使drawTwoView進行重繪了,這是為什麼呢?並且當drawOneView進行重繪的時候,怎麼也會帶動drawTwoView重繪,它們應該是分別由各自的類進行控制的,為什麼會出現這種情況呢?
一個用Invalidate(),另外一個用postInvalidate()就可以重新整理了
就是在你需要重新整理UI的地方分別調用Invalidate(),postInvalidate()就可以了。
Activity設為singleTop,長按Home鍵啟動的問題
若將Activity設定為singleTop的,則,按Home鍵之後,再長按啟動時候,Home鍵的啟動機制裡面,好像會重新啟動被設定為singleTop的Activity,儘管你的singleTop的Activity已經finish或者整個程式已經結束了。
目前的解決辦法是:做標記,然後在被設定為singleTop的Activity裡做攔截。
Android軟鍵盤擋住介面
AndroidManifest.xml 中設定
android:windowSoftInputMode="stateUnspecified|adjustPan"
不擠壓螢幕,反之為把介面擠壓上去。
<activity android:name=".activity.MainTabActivity" android:theme="@android:style/Theme.NoTitleBar" android:configChanges="keyboardHidden|orientation" android:screenOrientation="portrait" android:launchMode="singleTask" android:windowSoftInputMode="stateUnspecified|adjustPan"></activity>
需要注意的是:如果是TabActivity裡面的一個Activity有EditText有軟鍵盤彈出的時候,在該Activity設定沒有作用,需要在TabActivity裡設定。
Android使用AsyncTask下載圖片,最好使用WeakReference
有些人喜歡用Android提供的AsyncTask,但事實上AsyncTask的問題更加嚴重,Thread只有在run函數不結束時才出現這種記憶體泄露問題,然而AsyncTask內部的實現機制是運用了ThreadPoolExcutor,該類產生的Thread對象的生命週期是不確定的,是應用程式無法控制的,因此如果AsyncTask作為Activity的內部類,就更容易出現記憶體泄露的問題。
這種線程導致的記憶體泄露問題應該如何解決呢?
第一、將線程的內部類,改為靜態內部類。
第二、線上程內部採用弱引用儲存Context引用。
解決的模型如下:
public abstract class WeakAsyncTask<Params, Progress, Result, WeakTarget> extends AsyncTask<Params, Progress, Result> { protected WeakReference<WeakTarget> mTarget; public WeakAsyncTask(WeakTarget target) { mTarget = new WeakReference<WeakTarget>(target); } /** {@inheritDoc} */ @Override protected final void onPreExecute() { final WeakTarget target = mTarget.get(); if (target != null) { this.onPreExecute(target); } } /** {@inheritDoc} */ @Override protected final Result doInBackground(Params... params) { final WeakTarget target = mTarget.get(); if (target != null) { return this.doInBackground(target, params); } else { return null; } } /** {@inheritDoc} */ @Override protected final void onPostExecute(Result result) { final WeakTarget target = mTarget.get(); if (target != null) { this.onPostExecute(target, result); } } protected void onPreExecute(WeakTarget target) { // No default action } protected abstract Result doInBackground(WeakTarget target, Params... params); protected void onPostExecute(WeakTarget target, Result result) { // No default action } }
Android webview 載入網路視頻
webView.loadUrl(video_url);webView.setInitialScale(50);WebSettings setting = webView.getSettings();setting.setUseWideViewPort(true); setting.setJavaScriptEnabled(true); //Support JavaScript setting.setPluginsEnabled(true); //Support Plugins, for example just like flash plugin. setting.setSupportZoom(true); //Zoom Control on web (You don't need this if ROM supports Multi-Touch setting.setBuiltInZoomControls(true); //Enable Multitouch if supported by ROM webView.setWebViewClient(new MyWebViewClient());public class MyWebViewClient extends WebViewClient { private ProgressDialog loadingBar;@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) { loadingBar=ProgressDialog.show(mActivity, null, "正在載入…"); super.onPageStarted(view, url, favicon);}@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); // webview裡面的連結還在同一個頁面中載入 return true; }@Overridepublic void onPageFinished(WebView view, String url) { if(loadingBar.isShowing()){ loadingBar.dismiss(); } super.onPageFinished(view, url);} @Overridepublic void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { Toast.makeText(mActivity, "載入出錯!", Toast.LENGTH_LONG).show(); final AlertDialog alertDialog = new AlertDialog.Builder(mActivity).create(); alertDialog.setTitle("ERROR"); alertDialog.setMessage(description); alertDialog.setButton("OK", new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { alertDialog.dismiss(); } }); alertDialog.show();}}
Android 開發中的網路下載策略 與 檔案快取策略
一般的緩衝策略是:
一級記憶體緩衝、二級檔案快取(資料庫也算作檔案快取)、三級網路資料
一、網路下載的緩衝策略
關於網路下載檔案(圖片、音頻、視頻)的基本策略:
1.不要直接下載到目標檔案,應使用temp檔案作中轉,以確保檔案的正確性與完整性,流程如下:
a)以網路目標檔案名 A 產生唯一的本地目標檔案名 B
b)以本地目標檔案名 B 產生唯一的本地臨時檔案名稱 T
c)下載檔案到 T 中
d)下載完畢,校正檔案 T 的正確性與完整性
e)若不正確或不完整則 delete 檔案 T,並返回 false
f)校正完畢後,將檔案 T 重新命名 或 複製到 B 檔案
g)最後的清理現場,刪除臨時檔案 T,成功後,返回 true
2.儘力提供檔案正確性與完整性的校正:
a)正確性:比如 MD5/Hash Code 比對、檔案格式的比對。
b)完整性:比如 檔案大小是否一致、圖片的資料是否正確(圖片檔案頭中提供了相關資訊)
3.考慮對於下載到本地的檔案是否需要再做二次加工,可以思考以下情況:
a)比如網路源始圖片的大小為800*600,而我們需要作為縮圖的大小為160*145,所以考慮對下載後的檔案進行裁剪,再儲存,對於源始檔案則直接刪除。
二、檔案快取策略:
1.需要唯一的快取檔案的對應I/O key,一般可以使用 hashcode。
2.若是同一個檔案,以不同的時間,可以考慮,先清本機快取,再下載新的緩衝到本地。
3.同一檔案也可以加上時間戳記後,再產生唯一hashcode。
4.組建檔案緩時,也許需要作以下全面的考慮:
a)sdcard是否已經沒有空間(這個需求是存在的,但幾乎沒有人會考慮到,一旦發生,必crash)。
b)緩衝的清理策略。每日、每周定時清理?到達一個閥值後,自動清理?(若無清理策略,把垃圾資料一直當個寶一相存著,是很SB的)。
c)緩衝真正需要的資料。不要覺外存是無限的,所以就可以什麼都存,要知道,多則繁,繁則亂。曾經有一同事,每天存幾百MB的使用者資料(所有使用者的性別、age、連絡方式等等),而PM需要的只是一個每日數戶的活躍資料報表,於是最後改為緩衝每天的使用者分析報表資料即可(才10幾KB)。
d)給快取檔案加密。最簡單就是去掉檔案的副檔名,這也算加密,當然,你可以把服務端檔案加密,然後在記憶體中解密。這就看項目的需求而定,我的經驗也不足,一般就是改改副檔名之類的。
三、記憶體緩衝策略
記憶體緩衝策略是為了應對更加高效的緩衝,對於不是頻煩更新的檔案資料,就可以緩衝在記憶體中,但是有以下注意事項:
a)記憶體的I/O,弱引用。弱引用可以讓JVM更加合理、自主的回收。
b)記憶體緩衝的 key 也必須唯一,可以參考檔案快取 key 策略。
c)提供一個記憶體緩衝重新整理的介面。雖然記憶體緩衝本身的生命週期就較短,但它必竟是最上層的使用者資料,所以設計時提供一個UI重新整理介面,是可以考慮的。
Android中ListView的addFooterView不顯示的問題
mListView.addFooterView(btn_more, null, false);mListView.setAdapter(mBlogListAdapter);
把addFootView放在setAdapter之前就可解決。
Android自動彈出軟鍵盤
在onCreate中加入:
// 自動調出軟鍵盤Timer timer = new Timer();timer.schedule(new TimerTask() { @Override public void run() { ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE)).toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); }}, 200);
我是天王蓋地虎的分割線
android是什
android就是機器人的意思 android手機就是使用安卓系統的手機,由Google開發出來的 和一般智能手機差不多 不知道你說的普通手機是什麼意思 android手機能夠多
android是什
android就是機器人的意思 android手機就是使用安卓系統的手機,由Google開發出來的 和一般智能手機差不多 不知道你說的普通手機是什麼意思 android手機能夠多