2016-12-06 23 views
0

當我啓動我的活動我把這段代碼的尺寸的增加:如何在TextView中顯示我的列表

 size = getSize(); 
    readRSSEvent(str); 
    if(getSize()-size>0){ 
     events.setText(""+(getSize()-size)); 
    } 

    public void readRSSEvent(final String s) { 
      Thread thread = new Thread(new Runnable() { 

       @Override 
       public void run() { 
        try { 
         url_ = new URL(s); 
         feed_ = RssReader.read(url_); 
         rssItems_ = feed_.getRssItems(); 
         for (RssItem rssItem : rssItems_) { 
          item_ = new Item(rssItem.getTitle(), rssItem.getDescription(), 
            rssItem.getPubDate()); 
          list2.add(item_); 
         } 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
        size = list2.size(); 
        SharedUtilities.getInstance().saveItem2(list2, getApplicationContext()); 
       } 
      }); 
      thread.start(); 
     } 

public int getSize(){ 
     return this.size; 
    } 

但如果裏面的代碼永遠不會奏效,因爲的getSize尺寸總是返回0 我的目標是查找feed並將它們插入列表中,保存列表的大小,如果我的int大小之間的差值大於0,則會提醒用戶注意新事件。 每次啓動應用程序時都要重複一遍。

+0

使用AsyncTask來實現這個...因爲當你設置文本視圖是按順序設置的,但是線程並沒有按順序執行。 –

+0

在創建getSize()返回0,開始時的大小爲0,在readRSSEvent(str)大小爲0並且getSize()爲14之後,則14-0 = 14 ....或者我錯了? –

+0

嘗試使用我已發佈的答案...在函數onPostExecute設置textView然後檢查...發生了什麼... –

回答

0

按照Android documentation

的AsyncTask能夠正確且容易使用的UI線程。該類允許您執行後臺操作並在UI線程上發佈結果,而無需操作線程和/或處理程序。

它被認爲是不好的做法在Android code使用線程:

[線程]類和方法也往往使你的代碼更復雜,更難看了。當你的實現需要頻繁的UI更新

而是一個線程的複雜的操作,您應該使用的AsyncTask它會變得更糟:

private class ReadRSSTask extends AsyncTask < URL, Integer, Integer > { 
    protected Long doInBackground(URL...urls) { 
     try { 
      url_ = new URL(s); 
      feed_ = RssReader.read(urls[0]); 
      rssItems_ = feed_.getRssItems(); 
      for (RssItem rssItem: rssItems_) { 
       item_ = new Item(rssItem.getTitle(), rssItem.getDescription(), rssItem.getPubDate()); 
       list2.add(item_); 
      } 
     } catch (Exception e) { //Pokemon exception handling!!! 
      e.printStackTrace(); 
     } 
     size = list2.size(); 
     SharedUtilities.getInstance().saveItem2(list2, getApplicationContext()); 
     return size; 
    } 

    protected void onPostExecute(Integer result) { 
     if (result > 0) { 
      events.setText(String.vaulueOf(result)); 
     } 
    } 
} 

而且你將與調用它:

new ReadRSSTask().execute(new URL(str)); 
+0

謝謝你的工作完美 –

0

將其稱爲.... new DownloadFilesTask(str).execute();

private class DownloadFilesTask extends AsyncTask<Void, Void,Integer>{ 
String mURL; 
public DownloadFilesTask(String url){ 
this.mURL = url; 
} 
    protected Integer doInBackground(Void... vo) { 
        url_ = new URL(mURL); 
        feed_ = RssReader.read(url_); 
        rssItems_ = feed_.getRssItems(); 
        for (RssItem rssItem : rssItems_) { 
         item_ = new Item(rssItem.getTitle(),    rssItem.getDescription(), 
           rssItem.getPubDate()); 
         list2.add(item_); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       size = list2.size(); 
    return size; 
} 
protected void onPostExecute(Integer size) { 
      if(getSize()-size>0){ 
    events.setText(""+(getSize()-size)); 
    } 
} 

}

+0

我得到這個錯誤DownloadFilesTask()在DownloadFilesTask不能應用於(java.lang.String) –

+0

這是因爲構造函數是私人的...我不小心寫了虛空,而不是公共....因爲我在**記事本**中爲你寫這個代碼:p –

相關問題