对安卓常用的方法的不熟悉(注意事项)
安卓开发有许多常用的方法,比如split()作为分割字符串的利器,但用到正则表达式却又是一个难点:
String REGEX = "[^0-9]"; String regex = "[0-9]+";
比如sp存储(SharedPreFerences)中有同步与异步之分,需要甄别好用的地方:
- 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; }
- 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操作时要回主线程工作:
- 利用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; } } };
- 利用activity.runOnUiThread(Runnable action)
public void update(final Context context) { ((MainActivity) context).runOnUiThread(new Runnable() { @Override public void run() { //已在主线程中,可以更新UI } }
- view.post(Runnable action)
textView.post(new Runnable() { @Override public void run() { textView.setText("更新主线程"); //也能更新其他的控件 } });
view.postDelayed(Runnable action, long delayMillis)可以用来延迟发送
这些在现在的我看来是非常正常的操作,而当初写代码的时候却都是坑,什么子线程里操作UI导致闪退,还有布局文件的id没找到导致空指针,以及一些网络数据没请求到,直接点方法导致空指针,甚至当初还以为请求网络和接口数据等耗时操作都可以放在主线程,也导致了不少问题出现。
总结
尽管出了不少问题,但换而言之,这也是促进我进步的缘由,相信随着工作的时间越来越长,我一定可以避免这些小问题。 跌跌撞撞的成长,又美又疼才是本质。