2017-10-08 40 views
-1

我在Runnable的運行函數中使用Looper.prepare和Looper.loop。但問題是線程根本沒有循環,Runnable只運行一次。在Activity1中,我使用三個可運行線程,全部循環。兩個線程通過「while」循環(不需要更新UI)不斷從網絡獲取數據和圖片,一個線程通過「Looper」不斷更新本地sqlite中的數據和圖片。這些數據是:Android線程循環不工作

protected void onCreate(Bundle savedInstanceState) { 
...... 
new Thread(getMessageTask).start(); 
     getMessageHandler = new Handler() { 
      @Override 
      public void handleMessage(Message msg) { 
       super.handleMessage(msg); 
       i++; 
       System.out.println("niuanmata" + i); //one appear the first one 
       try { 

        ArrayList<Map<String, String>> listMessages = (ArrayList<Map<String, String>>)msg.obj; 
        boolean listchange = true; 

        if (oldMessages.size() != 0) { 
         if (listMessages.size() == oldMessages.size()) { 
          for (int i = 0; i < listMessages.size(); i++) { 
           Map<String, String> oldmessage = (Map<String, String>) oldMessages.get(i); 
           Map<String, String> newmessage = (Map<String, String>) listMessages.get(i); 
           if ((oldmessage.get("mID") != newmessage.get("mID")) || (oldmessage.get("mainContent") != newmessage.get("mainContent")) || (oldmessage.get("deadLine") != newmessage.get("deadLine"))) { 
            break; 
           } 
           if (i == (listMessages.size() - 1)) { 
            listchange = false; 
           } 
          } 
         } 
        } 
        if (listchange) { 
         SimpleAdapter adapter = new SimpleAdapter(MainActivity.this, listMessages, R.layout.layout_invites, 
           new String[]{"mID", "creater", "mainContent", "deadLine", "mtype", "createrLogo"}, 
           new int[]{R.id.tv_list_type, R.id.tv_list_name, R.id.tv_list_inviteword, R.id.tv_list_invitedate, R.id.tv_list_inviteid, R.id.iv_list_logo}); 
         lvMessage.setAdapter(adapter); 
         oldMessages = listMessages; 
        } 
       } catch (Exception e) { 
        Toast.makeText(MainActivity.this, "wrong: " + e.toString(), Toast.LENGTH_SHORT).show(); 
        return; 
       } 
      } 
     }; 

...... 
lvMessage.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
            long arg3) { //when creater click, update the message; when others click, reset the alarm 

       Toast.makeText(MainActivity.this, "ok" , Toast.LENGTH_SHORT).show(); 
      } 
     }); 
} 

......... 
Runnable synchroDataTask = new Runnable() { 
     @Override 
     public synchronized void run() { 
      //data syschno 
      while (IOHelper.loopjudge()) { 
       { 
        AccountsDB adb = new AccountsDB(MainActivity.this); 
        String thelastupdate = adb.getLastUpdate(account.getChatNO());  

        Calendar calendar = IOHelper.StringToCalendar(thelastupdate); 
        calendar.add(Calendar.MINUTE, -30); 
        String accountData = synchroDataWebservice(account.getChatNO(), IOHelper.CalendarToString(calendar)); //get the datas of the account synchroly 

        AccountBLL.saveDBofWebString(accountData, MainActivity.this, account); //use static method to save the DB string as SQLite data 
       } 
      } 
......... 

@Override 
     public synchronized void run() { 
      while (IOHelper.loopjudge()) { 
...... 
} 


....... 
Runnable getMessageTask = new Runnable() { 
     @Override 
     public synchronized void run() { 
      Looper.prepare(); 
      //while (IOHelper.loopjudge() && (!stopThread)) { 
       MessageDB messagedb = new MessageDB(MainActivity.this); 
       List<MessageMain> messages = messagedb.getMessageByChatNO(account.getChatNO()); 
       ArrayList<Map<String, String>> listMessages = setMessaageListToMap(messages); 
       Message msg = Message.obtain(); 
       msg.obj = listMessages; 
       getMessageHandler.sendMessageDelayed(msg, 1000); 
      //} 
      Looper.loop(); 
     } 
    }; 
...... 

在我的Android有限的經驗,我使用而做的getMessageTask環路,因爲數據和用戶界面的列表視圖需要不斷更新。但是無法點擊列表視圖。然後更改爲Looper,但UI的列表視圖不能不斷更新....

+0

根據db的數據,需要UI上的listview不斷更新。但不行。更重要的是,在我將Runnable的循環從Looper變爲Looper之後,UI立即轉向另一個活動。提前致謝。 – bluehale

回答

0

答案是我誤解了Looper的含義,認爲Looper.prepare()和Looper.loop()是while()循環,然後發生錯誤。 ()和Looper.loop()只是表示這個線程可以循環,但是我必須自己寫while循環或for循環。