編輯:關於Android編程
package cc.cn.logutil; import android.os.Bundle; import android.app.Activity; /** * Demo描述: * 對於Android系統Log輸出日志的封裝LogUtils * 1 可修改LogUtils中的LEVEL值覺得哪些級別的日志可以輸出. * 所以方便選擇性輸出日志或者屏蔽日志輸出 * 2 輸出的日志除了本想輸出的信息外還包含了該日志輸出時所屬 * 的線程,類,方法名,已經在該方法中的行數等實用信息 * 3 LogUtils的調用方式 * 3.1 按照系統原方式調用 * 3.2 或者不設置TAG,則默認為文件名 * * 備注說明: * 在該示例中主要用到了StackTrace和StackTraceElement. * 詳情可參見上篇博客《StackTrace簡述以及StackTraceElement使用實例》 * * PS: * 今天有些感冒,有些發燒.下班後完成這個示例,算是一種慰藉吧 * 2014年9月23日23:05:01. */ public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); LogUtils.i("MainActivity", "onCreate1"); LogUtils.i(null, "onCreate2"); LogUtils.i("", "onCreate3"); LogUtils.i("onCreate4"); test(); } private void test() { LogUtils.i("調用了MainActivity中的test()"); TestLog.testLog(); new Thread() { public void run() { LogUtils.i("調用了子線程"); }; }.start(); } @Override protected void onStart() { super.onStart(); LogUtils.i("onStart"); } @Override protected void onResume() { super.onResume(); LogUtils.i("onResume"); } @Override protected void onPause() { super.onPause(); LogUtils.i("onPause"); } @Override protected void onStop() { super.onStop(); LogUtils.i("onStop"); } @Override protected void onDestroy() { super.onDestroy(); LogUtils.i("onDestroy"); } }
package cc.cn.logutil; import android.text.TextUtils; import android.util.Log; /** * LogUtils工具說明: * 1 只輸出等級大於等於LEVEL的日志 * 所以在開發和產品發布後通過修改LEVEL來選擇性輸出日志. * 當LEVEL=NOTHING則屏蔽了所有的日志. * 2 v,d,i,w,e均對應兩個方法. * 若不設置TAG或者TAG為空則為設置默認TAG * */ public class LogUtils { public static final int VERBOSE = 1; public static final int DEBUG = 2; public static final int INFO = 3; public static final int WARN = 4; public static final int ERROR = 5; public static final int NOTHING = 6; public static final int LEVEL = VERBOSE; public static final String SEPARATOR = ","; public static void v(String message) { if (LEVEL <= VERBOSE) { StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3]; String tag = getDefaultTag(stackTraceElement); Log.v(tag, getLogInfo(stackTraceElement) + message); } } public static void v(String tag, String message) { if (LEVEL <= VERBOSE) { StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3]; if (TextUtils.isEmpty(tag)) { tag = getDefaultTag(stackTraceElement); } Log.v(tag, getLogInfo(stackTraceElement) + message); } } public static void d(String message) { if (LEVEL <= DEBUG) { StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3]; String tag = getDefaultTag(stackTraceElement); Log.d(tag, getLogInfo(stackTraceElement) + message); } } public static void d(String tag, String message) { if (LEVEL <= DEBUG) { StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3]; if (TextUtils.isEmpty(tag)) { tag = getDefaultTag(stackTraceElement); } Log.d(tag, getLogInfo(stackTraceElement) + message); } } public static void i(String message) { if (LEVEL <= INFO) { StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3]; String tag = getDefaultTag(stackTraceElement); Log.i(tag, getLogInfo(stackTraceElement) + message); } } public static void i(String tag, String message) { if (LEVEL <= INFO) { StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3]; if (TextUtils.isEmpty(tag)) { tag = getDefaultTag(stackTraceElement); } Log.i(tag, getLogInfo(stackTraceElement) + message); } } public static void w(String message) { if (LEVEL <= WARN) { StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3]; String tag = getDefaultTag(stackTraceElement); Log.w(tag, getLogInfo(stackTraceElement) + message); } } public static void w(String tag, String message) { if (LEVEL <= WARN) { StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3]; if (TextUtils.isEmpty(tag)) { tag = getDefaultTag(stackTraceElement); } Log.w(tag, getLogInfo(stackTraceElement) + message); } } public static void e(String tag, String message) { if (LEVEL <= ERROR) { StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3]; if (TextUtils.isEmpty(tag)) { tag = getDefaultTag(stackTraceElement); } Log.e(tag, getLogInfo(stackTraceElement) + message); } } /** * 獲取默認的TAG名稱. * 比如在MainActivity.java中調用了日志輸出. * 則TAG為MainActivity */ public static String getDefaultTag(StackTraceElement stackTraceElement) { String fileName = stackTraceElement.getFileName(); String stringArray[] = fileName.split("\\."); String tag = stringArray[0]; return tag; } /** * 輸出日志所包含的信息 */ public static String getLogInfo(StackTraceElement stackTraceElement) { StringBuilder logInfoStringBuilder = new StringBuilder(); // 獲取線程名 String threadName = Thread.currentThread().getName(); // 獲取線程ID long threadID = Thread.currentThread().getId(); // 獲取文件名.即xxx.java String fileName = stackTraceElement.getFileName(); // 獲取類名.即包名+類名 String className = stackTraceElement.getClassName(); // 獲取方法名稱 String methodName = stackTraceElement.getMethodName(); // 獲取生日輸出行數 int lineNumber = stackTraceElement.getLineNumber(); logInfoStringBuilder.append("[ "); logInfoStringBuilder.append("threadID=" + threadID).append(SEPARATOR); logInfoStringBuilder.append("threadName=" + threadName).append(SEPARATOR); logInfoStringBuilder.append("fileName=" + fileName).append(SEPARATOR); logInfoStringBuilder.append("className=" + className).append(SEPARATOR); logInfoStringBuilder.append("methodName=" + methodName).append(SEPARATOR); logInfoStringBuilder.append("lineNumber=" + lineNumber); logInfoStringBuilder.append(" ] "); return logInfoStringBuilder.toString(); } }
package cc.cn.logutil; public class TestLog { public static void testLog(){ LogUtils.i("調用了TestLog中的testLog()"); } }
對於ListVie來說,數據項的設置有很多種方式,而自定義實現BaseAdapter是最經常用的了,那麼這裡我們來講解一下自定義實現BaseAdapter的普通實現。Ma
郁悶了半天,今天發現一點擊手機 menu 鍵應用就崩潰了,記得之前都是好好的,調試了半天代碼還是搞不定,於是網上google了一番,發現僅國外有一兩篇文章有提到類
最近有一個需求就是往程序中加入大數據的采集點,但是因為我們的Android程序包含兩個進程,所以涉及到跨進程通信的問題。現將Android中的跨進程通信方式
流程圖盜張網上的流程圖源碼分析構建RequestQueueVolley 的調用比較簡單,通過 newRequestQueue(…) 函數新建並啟動一個請求隊