我奇怪的安卓开发历程(内含本人不太成熟的技术观)(二)

简介: 初出茅庐的我在开发工作中成长,收获了许多,但其实也引出了一堆问题。

对安卓常用的方法的不熟悉(注意事项)

安卓开发有许多常用的方法,比如split()作为分割字符串的利器,但用到正则表达式却又是一个难点:

String REGEX = "[^0-9]";
String regex = "[0-9]+";

比如sp存储(SharedPreFerences)中有同步与异步之分,需要甄别好用的地方:

  1. commit():
public boolean commit() {
   ...
   //1.将改动先同步到内存
   MemoryCommitResult mcr = commitToMemory();
   //2.同步写入磁盘
   SharedPreferencesImpl.this.enqueueDiskWrite(
       mcr, null /* sync write on this thread okay */);
   try {
       mcr.writtenToDiskLatch.await();
   }...
   return mcr.writeToDiskResult;
}
  1. apply():
public void apply() {
    final MemoryCommitResult mcr = commitToMemory();
    ...
    Runnable postWriteRunnable = new Runnable() {
            @Override
            public void run() {
                awaitCommit.run();
                QueuedWork.removeFinisher(awaitCommit);
            }
        };
    //postWriteRunnable不为null
    SharedPreferencesImpl.this.enqueueDiskWrite(mcr, postWriteRunnable);
  ...
}

当时不清楚这个导致应用会出现数据刷新的时候有时候不能及时更新到有效数据。 还有子线程里要对UI操作时要回主线程工作:

  1. 利用Handle消息处理

启用子线程:

private class ThreadTest extends Thread {
        public ThreadTest() {
            super();
        }
        @Override
        public void run() {
            super.run();
            while (true) {
                bool flag = xxx();
                if (flag) {
                    Message msg = new Message();
                    msg.obj = "接口调用成功";
                    msg.what=0;
                    myHandler.sendMessage(msg);
                    break;
                }
            }
        }

回到主线程显示UI:

Handler myHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch(msg.what) {
                case 0:
                    //更新UI等
                    break;
                case 1:
                    //更新UI等
                    break;
                default:
                    break;
            }
        }
    };
  1. 利用activity.runOnUiThread(Runnable action)
public void update(final Context context) {
  ((MainActivity) context).runOnUiThread(new Runnable() {
                  @Override public void run() {
                 //已在主线程中,可以更新UI
                  }
   }
  1. view.post(Runnable action)
textView.post(new Runnable() {
         @Override public void run() {
                     textView.setText("更新主线程");
                     //也能更新其他的控件
                    }
   });

view.postDelayed(Runnable action, long delayMillis)可以用来延迟发送

这些在现在的我看来是非常正常的操作,而当初写代码的时候却都是坑,什么子线程里操作UI导致闪退,还有布局文件的id没找到导致空指针,以及一些网络数据没请求到,直接点方法导致空指针,甚至当初还以为请求网络和接口数据等耗时操作都可以放在主线程,也导致了不少问题出现。

总结

尽管出了不少问题,但换而言之,这也是促进我进步的缘由,相信随着工作的时间越来越长,我一定可以避免这些小问题。 跌跌撞撞的成长,又美又疼才是本质。

相关文章
|
30天前
|
存储 JavaScript 前端开发
“纯血鸿蒙”要来了,赶紧入手学习吧
1月18日,华为宣布HarmonyOSNEXT鸿蒙星河版面向开发者开放申请,这一最新版本的鸿蒙系统也被喻为“纯血鸿蒙”。赶紧入手学习吧
144 1
|
30天前
|
弹性计算 Java 程序员
推荐程序员必知的四大神级学习网站
今天给大家整理一些小编经常学习和访问的学习网站,供大家参考学习。
|
30天前
|
机器人 程序员 C++
Scratch3.0——助力新进程序员理解程序(难度案例一、节奏大师)
Scratch3.0——助力新进程序员理解程序(难度案例一、节奏大师)
65 0
|
7月前
|
SQL 安全 Java
硬核,腾讯内部整理的面向开发人员代码安全指南,适合所有程序员
硬核,腾讯内部整理的面向开发人员代码安全指南,适合所有程序员
52 0
值得一看!阿里又杀疯了开源内部“M9”级别全彩版分布式实战笔记
系统架构大致经历了单体应用架构→垂直应用架构→分布式架构→SOA架构→微服务架构的演变
|
10月前
|
编解码 iOS开发
一节微课诞生的全过程(无保留分享,望收藏)
本来是想以直播的方式把制作这节微课的过程分享出来,但考虑到大家的时间不统一,制作过程太长,这节微课录音之后制作动画就足足用了两天
152 0
|
前端开发 Android开发
我奇怪的安卓开发历程(内含本人不太成熟的技术观)(四)
工作一天下来,最大的收获便是我发现项目写了半年我还是不知道这是个啥架构的,通过几次和同事沟通交流,以及浏览许多介绍和实例MVP、MVVM架构的文章,还是不了了之,当然,不能否认的是同事认为这是MVP架构的项目,我也挺倾向这个观点。
|
程序员 开发工具 Android开发
我奇怪的安卓开发历程(内含本人不太成熟的技术观)(三)
半年的开发工作通过统计git的提交记录发现其实我提交行数最多的项目也就1228行:
|
设计模式 算法 Java
工作这么多年,你能向新人解释清到底什么是面向对象编程吗?(下)
工作这么多年,你能向新人解释清到底什么是面向对象编程吗?(下)
工作这么多年,你能向新人解释清到底什么是面向对象编程吗?(下)
|
程序员
工作这么多年,你能向新人解释清到底什么是面向对象编程吗?(上)
工作这么多年,你能向新人解释清到底什么是面向对象编程吗?(上)