重写Application ——》BaseApplication
Context
Thread
Handler 不应该new太多导致溢出,只要全局一个 (系统优化,主线程只要一个就够了)
Looper
( long ThreadId) 线程id
用户id 两个用户进程若是相互访问,在清单文件中配置 android:shareUserId
几个常见的UI工具类
上下文获取
获取资源
主线程中执行任务 【 不知道是主线程还是子线程执行()】
适配器方法: dip2px(int dip) px2dip(int px)
日志管理(大公司收集用户习惯)
ctrl+O 看方法结构图
//总体的书写思路就是把类的成员变量new出来后,设置他们的get/set访问权利)
public class BaseApplication extends Application
{
private static Context mContext;
private static Thread mMainThread;
private static long mMainThreadId;
private static Handler mMainThreadHandler;
private static Looper mMainThreadLooper;
@Override
public void onCreate()
{
super.onCreate();
// 在应用程序入口提供全局的工具
// 上下文
mContext = this;
// 主线程和子线程
mMainThread = Thread.currentThread();
// 主线程id
// mMainThreadId = mMainThread.getId();
// android.os.Process.myPid();// 进程id
mMainThreadId = android.os.Process.myTid();// 当前线程id
// android.os.Process.myUid();//用户id
// 主线程handler
mMainThreadHandler = new Handler();
//
mMainThreadLooper = getMainLooper();
}
public static Context getContext()
{
return mContext;
}
public static Thread getMainThread()
{
return mMainThread;
}
public static long getMainThreadId()
{
return mMainThreadId;
}
public static Handler getMainThreadHandler()
{
return mMainThreadHandler;
}
public static Looper getMainThreadLooper()
{
return mMainThreadLooper;
}
} public class UIUtils
{
/**
* 上下文的获取
*
* @return
*/
public static Context getContext()
{
return BaseApplication.getContext();
}
/**
* 获取资源
*
* @return
*/
public static Resources getResources()
{
return getContext().getResources();
}
public static long getMainThreadId()
{
return BaseApplication.getMainThreadId();
}
public static Handler getMainThreadHandler()
{
return BaseApplication.getMainThreadHandler();
}
/**
* 主线程中执行 任务
*
* @param task
*/
public static void runOnUiThread(Runnable task)
{
long currentThreadId = android.os.Process.myTid();
long mainThreadId = getMainThreadId();
if (currentThreadId == mainThreadId)
{
// 如果在主线程中执行
task.run();
}
else
{
// 需要转的主线程执行
getMainThreadHandler().post(task);
}
}
/**
*
* @param dip
* @return
*/
public static int dip2px(int dip)
{
// 公式 1: px = dp * (dpi / 160)
// 公式 2: dp = px / denistity;
DisplayMetrics metrics = getResources().getDisplayMetrics();
float density = metrics.density;
// metrics.densityDpi
return (int) (dip * density + 0.5f);
}
public static int px2dip(int px)
{
// 公式 1: px = dp * (dpi / 160)
// 公式 2: dp = px / denistity;
DisplayMetrics metrics = getResources().getDisplayMetrics();
float density = metrics.density;
// metrics.densityDpi
return (int) (px / density + 0.5f);
}
public static String getString(int resId)
{
return getResources().getString(resId);
}
public static String getPackageName()
{
return getContext().getPackageName();
}
public static String[] getStringArray(int resId)
{
return getResources().getStringArray(resId);
}
public static int getColor(int resId)
{
return getResources().getColor(resId);
}
/**
* 执行延时操作
*
* @param task
* @param delay
*/
public static void postDelayed(Runnable task, long delay)
{
getMainThreadHandler().postDelayed(task, delay);
}
/**
* 移除任务
*
* @param task
*/
public static void removeCallbacks(Runnable task)
{
getMainThreadHandler().removeCallbacks(task);
}
/**
* 开启activity
*
* @param intent
*/
public static void startActivity(Intent intent)
{
getContext().startActivity(intent);
}
}
public class LogUtils {
/** 日志输出级别NONE */
public static final int LEVEL_NONE = 0;
/** 日志输出级别V */
public static final int LEVEL_VERBOSE = 1;
/** 日志输出级别D */
public static final int LEVEL_DEBUG = 2;
/** 日志输出级别I */
public static final int LEVEL_INFO = 3;
/** 日志输出级别W */
public static final int LEVEL_WARN = 4;
/** 日志输出级别E */
public static final int LEVEL_ERROR = 5;
/** 日志输出时的TAG */
private static String mTag = "GooglePlay";
/** 是否允许输出log */
private static int mDebuggable = LEVEL_ERROR;
/** 用于记时的变量 */
private static long mTimestamp = 0;
/** 写文件的锁对象 */
private static final Object mLogLock = new Object();
/** 以级别为 d 的形式输出LOG */
public static void v(String msg) {
if (mDebuggable >= LEVEL_VERBOSE) {
Log.v(mTag, msg);
}
}
/** 以级别为 d 的形式输出LOG */
public static void d(String msg) {
if (mDebuggable >= LEVEL_DEBUG) {
Log.d(mTag, msg);
}
}
/** 以级别为 i 的形式输出LOG */
public static void i(String msg) {
if (mDebuggable >= LEVEL_INFO) {
Log.i(mTag, msg);
}
}
/** 以级别为 w 的形式输出LOG */
public static void w(String msg) {
if (mDebuggable >= LEVEL_WARN) {
Log.w(mTag, msg);
}
}
/** 以级别为 w 的形式输出Throwable */
public static void w(Throwable tr) {
if (mDebuggable >= LEVEL_WARN) {
Log.w(mTag, "", tr);
}
}
/** 以级别为 w 的形式输出LOG信息和Throwable */
public static void w(String msg, Throwable tr) {
if (mDebuggable >= LEVEL_WARN && null != msg) {
Log.w(mTag, msg, tr);
}
}
/** 以级别为 e 的形式输出LOG */
public static void e(String msg) {
if (mDebuggable >= LEVEL_ERROR) {
Log.e(mTag, msg);
}
}
/** 以级别为 e 的形式输出Throwable */
public static void e(Throwable tr) {
if (mDebuggable >= LEVEL_ERROR) {
Log.e(mTag, "", tr);
}
}
/** 以级别为 e 的形式输出LOG信息和Throwable */
public static void e(String msg, Throwable tr) {
if (mDebuggable >= LEVEL_ERROR && null != msg) {
Log.e(mTag, msg, tr);
}
}
/**
* 把Log存储到文件中
*
* @param log
* 需要存储的日志
* @param path
* 存储路径
*/
public static void log2File(String log, String path) {
log2File(log, path, true);
}
public static void log2File(String log, String path, boolean append) {
synchronized (mLogLock) {
FileUtils.writeFile(log + "\r\n", path, append);
}
}
/**
* 以级别为 e 的形式输出msg信息,附带时间戳,用于输出一个时间段起始点
*
* @param msg
* 需要输出的msg
*/
public static void msgStartTime(String msg) {
mTimestamp = System.currentTimeMillis();
if (!TextUtils.isEmpty(msg)) {
e("[Started:" + mTimestamp + "]" + msg);
}
}
/** 以级别为 e 的形式输出msg信息,附带时间戳,用于输出一个时间段结束点* @param msg 需要输出的msg */
public static void elapsed(String msg) {
long currentTime = System.currentTimeMillis();
long elapsedTime = currentTime - mTimestamp;
mTimestamp = currentTime;
e("[Elapsed:" + elapsedTime + "]" + msg);
}
public static <T> void printList(List<T> list) {
if (list == null || list.size() < 1) {
return;
}
int size = list.size();
i("---begin---");
for (int i = 0; i < size; i++) {
i(i + ":" + list.get(i).toString());
}
i("---end---");
}
public static <T> void printArray(T[] array) {
if (array == null || array.length < 1) {
return;
}
int length = array.length;
i("---begin---");
for (int i = 0; i < length; i++) {
i(i + ":" + array[i].toString());
}
i("---end---");
}
}