美文网首页Android知识Android开发Android开发经验谈
Android开源中国源代码粗读学习到的东西

Android开源中国源代码粗读学习到的东西

作者: 黑狗狗哥 | 来源:发表于2017-07-16 10:39 被阅读183次

    开源中国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>

    相关文章

      网友评论

        本文标题:Android开源中国源代码粗读学习到的东西

        本文链接:https://www.haomeiwen.com/subject/lcstkxtx.html