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

363 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情 >> 希望大家可以帮忙点个赞,谢谢!

引言

书接上回,初出茅庐的我在开发工作中成长,收获了许多,但其实也引出了一堆问题。因为我是考研失败才走上的工作这个路子,所以我经常有种觉得我还有机会的错误认识,但实际上时光对一个不太上进的人是很残忍的,它会让你清晰的认识到自己的问题所在。

对安卓开发的错误想法

当时认为自己学习能力肯定很强,但公司并不是你去学习的最佳地方,因为你需要完成工作任务,我的第一个任务就是直接对已经开发的很成熟的app动手,而这个app的用户量超过20W+,这也让我滋生了害怕的情绪,觉得自己要是没法完成或者出了问题那责任会很大。其实这也是我没有融入这个团队的一种表现,其实我写的要经过测试的多次验证才会正式走出去,而且部门的大哥也鼓舞了我,才让我慢慢走了下去。其实,开发工作中团队的协作很重要,毕竟大家的代码最终都是要合到一起的。

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

安卓开发有许多常用的方法,比如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没找到导致空指针,以及一些网络数据没请求到,直接点方法导致空指针,甚至当初还以为请求网络和接口数据等耗时操作都可以放在主线程,也导致了不少问题出现。

总结

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