总以为自己对Handler比较了解,但今天发现还是不了解,以后写代码得好好的看看android doc了,这样才能理解的更深。
一直以为Handler.post(Runnable)为开启一个线程,所以出现了一下问题。
我定义了一个Runnable用来实现短信的分段读取:

private class SubSectionRunnable implements Runnable{          private Cursor mCursor;          private final int RECIPIENT_IDS = 3;          private final int SNIPPET = 4;          private String mRecipient;          private String mSnippet;          private String mNumber;          private Long mSnippetCS;          private String mName;          private String mThreadId;          private final int mFirstQueryStep = 20;          private final int mOtherQueryStep = 80;          private Long mDate = 0l;          private boolean mIsFirstQuery = true;          private TestSpeed mTestSpeed1 = new TestSpeed();          private TestSpeed mTestSpeed2 = new TestSpeed();          @Override          public void run() {              mTestSpeed1.loadBeginTime();              mCursor = getContentResolver().query(THREADS_URI,                      ALL_THREADS_PROJECTION, null, null, "date DESC limit " + mFirstQueryStep);              while(mCursor != null && mCursor.getCount() > 0){                  Log.i("xiao", "onPostExecute new " + mCursor.getCount());                  ConversationInfo conver = new ConversationInfo();                  mConversationInfoPreviousList.add(conver);                  while(mCursor.moveToNext()){                      mThreadId = mCursor.getString(ID);                      mDate = mCursor.getLong(DATE);                      mRecipient = mCursor.getString(RECIPIENT_IDS);                      mSnippetCS = mCursor.getLong(SNIPPET_CS);                      if(mSnippetCS ==0){                          mSnippet = mCursor.getString(SNIPPET);                      }                      else{                          try {                              mSnippet = new String(                                      mCursor.getString(SNIPPET).getBytes("ISO8859_1"), "utf-8");                          } catch (UnsupportedEncodingException e) {                              // TODO Auto-generated catch block                              e.printStackTrace();                          }                      }                      Cursor cr = getContentResolver().query(                              Uri.parse("content://mms-sms/canonical-addresses"),                              new String[] { "_id", "address" }, "_id=?",                              new String[] { mRecipient }, null);                      if(cr != null && cr.moveToFirst()){                          mNumber = cr.getString(1);                          mName = getContactNameByPhone(cr.getString(1));                      }                      else{                          mNumber = "";                          mName = null;                      }                      ConversationInfo conversation = new ConversationInfo(mRecipient, mSnippet, mNumber, mSnippetCS, mName, mThreadId);                      mConversationInfoPreviousList.add(conversation);                  }                  for( int i = 0; i < mConversationInfoPreviousList.size(); i++){                      try {                          mConversationInfoAdapterList.add(mConversationInfoPreviousList.get(i).clone());                      } catch (CloneNotSupportedException e) {                          // TODO Auto-generated catch block                          e.printStackTrace();                      }                  }                  mCursor.close();                  if(mIsFirstQuery){                      Message message = new Message();                      message.what = 1;                      boolean flag1 = mGetMmsHandler.sendMessage(message);                      Log.i("xiao", "flag1 = " + flag1);                      mIsFirstQuery = !mIsFirstQuery;                      mTestSpeed1.loadEndTime();                      mTestSpeed1.printDuration();                  }                  Message message = new Message();                  message.what = 2;                  boolean flag2 = mGetMmsHandler.sendMessage(message);                  Log.i("xiao", "flag2 = " + flag2);                  mTestSpeed2.loadEndTime();                  mTestSpeed2.printDuration();                  mCursor = null;                  mTestSpeed2.loadBeginTime();                  mCursor = getContentResolver().query(THREADS_URI,                          ALL_THREADS_PROJECTION, "date < " + mDate, null, "date DESC limit " + mOtherQueryStep);                  }          }          public String getContactNameByPhone(String number) {              String name = "";              Uri personUri = Uri.withAppendedPath(                      ContactsContract.PhoneLookup.CONTENT_FILTER_URI, number);              try{                  Cursor cur = getContentResolver().query(personUri,                      new String[] { PhoneLookup.DISPLAY_NAME },                      null, null, null );              if(cur != null){                  if( cur.moveToFirst() ) {                      int nameIdx = cur.getColumnIndex(PhoneLookup.DISPLAY_NAME);                      name = cur.getString(nameIdx);                  }                  cur.close();              }              }              catch(Exception e){                  Log.i("xiao", "" + e.getMessage());              }              return name;          }      }  

然后定义了一个Handler用来更新界面:

private class GetMmsHandler extends Handler{          @Override          public void handleMessage(Message msg) {              // TODO Auto-generated method stub              super.handleMessage(msg);              int what = msg.what;              switch(what){              case 0:                  showProgress();                  mGetMmsThread.start();                  break;              case 1:                  hideProgress();                  break;              case 2:                  Log.i("xiao", "handleMessage 22222222222222");                  mConversationAdapter.notifyDataSetChanged();                  break;              }          }      }  

但我发现每次都是等所有的短信读取完毕后才会打印几次handlerMessage 222222222222信息,所以界面更本没有出现先显示一些,然后陆续加载的过程,我就很奇怪,为什么会会是这样呢,我在mGetMmsHandler.sendMessage后加了判断,看这个消息是否发送成功,验证后是发送成功了,我就查看Handler的doc,原来post(Runnable)是把这个Runnable加到当前的消息队列中,所以等这个Runnable处理完毕后才会处理接受到的多次what为2的消息。

更多相关文章

  1. Android(安卓)Lollipop 设置状态栏颜色
  2. [置顶] android fragment hidenChanged方法分析
  3. Android用软键盘将整个界面推上去
  4. Android实现计算器布局(四种布局方式)之GridLayout网格布局
  5. 完美解决Android中AVD模拟器启动慢(卡在Android启动界面)等问题
  6. apk之间资源共享
  7. Android(安卓)网络应用--Apache HttpClient的使用
  8. 【Android(安卓)界面效果18】Android软件开发之常用系统控件界面
  9. 使用Android系统隐藏api读取*.apk程序安装包信息

随机推荐

  1. 使用ActiveMQ+MQTT实现Android点对点消息
  2. assets android 获取流 转为string
  3. Android之TextView
  4. Android(安卓)的用户层 uevent处理机制
  5. 演化理解 Android(安卓)异步加载图片
  6. Android(安卓)Design Demo 策略模式 Text
  7. android的窗口机制分析---------类图关系
  8. Android(安卓)AIDL进程间通信(IPC)
  9. Android(安卓)Activity和Intent机制学习
  10. Android内核的简单分析