开源中国App源代码粗读学习到的东西
AppConfig
一个单例类,应用程序配置类,用来保存用户相关的信息和设置,配置类默认图片的默认存放路径,文件下载路径等.
学到的东西
我们可以通过Properties类来存放在Context.getDir(“”,Context.MODE_PRIVATE)文件夹下,这样子做保护了配置数据安全;吧Stream的close设置成一个Util类,因为Stream是实现Closeable接口的,然后每次try catch后在在finally中关闭这些Stream.
细节代码如下:
<pre>public static void close(Closeable... closeables) {
if (closeables == null || closeables.length == 0)
return;
for (Closeable closeable : closeables) {
if (closeable != null) {
try {
closeable.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}</pre>
AppContext
全局应用程序类保存和调用应用配置及访问网络数据
学到的东西
平时在设置缓存的时候,我们可以缓存的内容卸载AppConfig中所说的Properties实例中,但是缓存的key最好是startWith(temp)这样子在清楚缓存的时候就可以根据这个关闭缓存了.
判断当前版本是否兼容目标方法的时候可以通过当前的VersionCode是否>=目标的VersionCode.
代码如下:
<pre>public static boolean isMethodsCompat(int VersionCode) {
int currentVersion = android.os.Build.VERSION.SDK_INT;
return currentVersion >= VersionCode;
}
</pre>
AppCrashHandler
全局未捕获异常类
学到的东西
在发生异常的时候,我们应该在处理异常之前跳到自定义的界面然后在处理异常,平时我们Build的版本又DEBUG和RELEASE,在RELEASE模式肯定希望在处理未捕获的异常的时候,使用我们自定义的友好页面,但是我们又希望在DEBUG模式下,不启动这恶鬼友好页面以便我们可以在控制台看到异常信息.
代码如下:
<pre>@Override
public void uncaughtException(Thread thread, Throwable ex) {
ErrorActivity.show(mContext, ex.getMessage());
if (mDefaultHandler != null && (BuildConfig.DEBUG || (!handleException(ex)))) {
mDefaultHandler.uncaughtException(thread, ex);
} else { android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
}
}
</pre>
LaunchActivity
app的第一个页面,在这个页面中会判断是否这个App更新过,如果更新过就处理Cookie的转移,OSCApplication的重新初始化.
学到的东西
在一个复杂的App中,我们可以通过一个自定义一个线程池来提升避免App创建多个线程.
代码如下:
<pre>public static Executor getExecutor() {
if (EXECUTORS_INSTANCE == null) {
synchronized (AppOperator.class) {
if (EXECUTORS_INSTANCE == null) {
EXECUTORS_INSTANCE = Executors.newFixedThreadPool(6);
}
}
}
return EXECUTORS_INSTANCE;
}
public static void runOnThread(Runnable runnable) {
getExecutor().execute(runnable);
}</pre>
而且这个判断更新的方式也很精妙,原理就是在SharedPreferences存着当前VersionCode,只要这个App更新了,则当前的VersionCode也增加了,这个时候与存放VersionCode做个对比,然后就可以判断是否更新了
OSCApplication
这个就是整个APP的Application类,主要是用于初始化未知异常捕获类,网络请求类,百度地图SDK类等
学到的东西
TypeToken可以获取泛型的类型,因为在运行时我们是获取不到泛型的类型的,所以只能使用这个类来获取泛型的类型了
UIHelper
这个类主要是处理一些界面Activity的跳转.
学到的东西
如果一个App中有许多个Activity,这个时候我们就可以在这个UIHelper创建多个静态的showXXX的方法,在配合上之前说过在Activity或者Fragment中的show方法,就可以很轻松的打开一个Activity.
Wxapi包下的WXEntryActivity
处理微信登录的Activity
学到的东西
我们在一个APP中经常使用到Dialog,这样子我们就可以自己创建一个DialogHelper来创建同一主题的Dialog
代码如下:
<pre>public static AlertDialog.Builder getDialog(Context context) {
return new AlertDialog.Builder(context, R.style.App_Theme_Dialog_Alert);
}
public static AlertDialog.Builder getMessageDialog(
Context context,
String title,
String message,
boolean cancelable) {
return getDialog(context)
.setCancelable(cancelable)
.setTitle(title)
.setMessage(message)
.setPositiveButton("确定", null);
}
public static AlertDialog.Builder getMessageDialog(
Context context,
String title,
String message) {
return getMessageDialog(context, title, message, true);
}
</pre>
一些Activity和Fragment学到的东西
如果一个团队多个人开发一个APP或者写完这个App后再给他人接手,通常情况下,为了避免他人调用我们的Activity或者Fragment要通过读我们的代码浪费时间,这个时候我们最好在自己创建的Activity或者Fragment中创建一个类似与show的方法来启动自己的Activity,show方法的参数是要传过来的参数.
代码如下:
<pre>public static void show(Context context, long id, int type) {
Intent intent = new Intent(context, CommentExsActivity.class);
intent.putExtra("id", id);
intent.putExtra("type", type);
context.startActivity(intent);
}
</pre>
一些方法中学到的东西
写一个方法,最好是在方法里面检查参数的有效性.
代码如下:
<pre>public static void saveImage(Context context, String fileName,
Bitmap bitmap, int quality) throws IOException {
if (bitmap == null || fileName == null || context == null)
return;
</pre>
网友评论