?? rssfeedopen.java
字號:
/**
//文檔生成日期:2005.10.07
//
//(1)概述:
//類名稱:RssFeedOpen
//類說明:
//?? “讀取Rss Feed新聞”的Form界面
*
//所在子系統:RssOwlMIDlet
//
//系統總描述:
我們提供的RSS無線閱讀器J2ME版本[開源]是一個可以下載到手機(例如Nokia7610)或者其他無線手持設備(例如PocketPC)的應用程序,用來閱讀存在于Internet中廣泛的RSS新聞源。
子系統描述:
RSS無線閱讀器的功能列表:
RSS Feed列表
添加Rss Feed
編輯Rss Feed
刪除Rss Feed
讀取Rss Feed新聞
查看新聞摘要
重新讀取Rss Feed新聞
關于我
//(2)歷史記錄:
//創建人: 鄭昀(2005.10.07)
//聯系我: Google Talk >> zhengyun@gmail.com
//Blogs: http://blog.csdn.net/zhengyun_ustc/以及http://www.cnblogs.com/zhengyun_ustc
//(3)版權聲明:
//由于我這個版本的RSS J2ME閱讀器也是基于Tommi和garrey源代碼基礎上改編而來的,
//所以決定遵照GPL協議的大意開放源代碼,您可以自由傳播和修改,在遵照GPL協議的約束條件的前提下。
//(4)相關資源:
1:《[J2ME]RSSOwlMidlet(RSS無線閱讀器)開源說明》
2:《[J2ME]RSSOwlMidlet(RSS無線閱讀器)設計說明》
3:下載源代碼:
////////////////////////////////////////////////////////////////////*/
package com.ultrapower.view;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.List;
import javax.microedition.lcdui.TextField;
import com.ultrapower.control.GUIController;
import com.ultrapower.model.RssFeed;
import com.ultrapower.model.RssFeedParser;
import com.ultrapower.model.RssItem;
import com.ultrapower.tools.SResources;
/**********************************************************
//RssFeedOpen
//
//Class Description:
// 顯示當前選中的Rss Feed的新聞列表,以新聞條目主題列表方式顯示。提供菜單命令有:
* 讀取新聞
* 添加書簽
* 編輯書簽
* 刪除書簽
* 關于我
//
//Author:
//zhengyun@ultrapower 2005.10.07
//
**********************************************************/
public class RssFeedOpen extends Form
implements Runnable{
private GUIController controller;
private Display m_display; // The display for this MIDlet
private Command m_openHeaderCmd; // The open header command
private Command m_backHeaderCmd; // The back to bookmark list command
private Command m_updateCmd; // The update headers command
private TextField errorTextField;
private boolean m_getPage; // The noticy flag for HTTP
private List m_headerList; // The header list
private RssFeedParser m_curRssParser; // The currently selected RSS
private Thread m_netThread; // The thread for networking
private static Image m_iconOpen = SResources.getImage(
SResources.IMG_UNREADFEED);
private static Image m_iconError = SResources.getImage(
SResources.IMG_ERROR);
private int m_nErrorTextFieldId;
private int m_nErrorImageFieldId;
private WaitFlash m_WaitFlash;
/**********************************************************
// RssFeedOpen::RssFeedOpen
//
// Description:
// 初始化界面:
* 初始化菜單命令;
* 初始化新聞條目列表;
* 本Form其實也是一個Thread,我們為了讓后臺來獲取并解析RSS XML,所以啟動線程
* 加載圖像
//
// Parameters:
// Return Values:
// Remark:
*
// Author:
// zhengyun@ultrapower 2005.10.07
//
**********************************************************/
public RssFeedOpen(String title, GUIController control){
super(title);
controller = control;
m_nErrorTextFieldId = -1;
m_nErrorImageFieldId = -1;
m_display = controller.rssMidlet.getCurrentDisplay();
m_openHeaderCmd = new Command(SResources.MENU_COMMAND_VIEWDETAIL, Command.SCREEN, 1);
m_backHeaderCmd = new Command(SResources.MENU_COMMAND_BACKCMD, Command.BACK,1);
m_updateCmd = new Command(SResources.MENU_COMMAND_UPDATENEWS, Command.SCREEN, 2);
initializeHeadersList();
this.setCommandListener(new RssFeedOpenListener());
/** Initialize thread for http connection operations */
m_netThread = new Thread(this);
m_netThread.start();
}
/**********************************************************
// RssFeedOpen::updateHeaders
//
// Description:
// 更新新聞條目列表:
* 先將當前新聞列表全部刪除
* 再告訴后臺線程,可以去讀取并解析RSS Feed了
//
// Parameters:
// Return Values:
// Remark:
*
// Author:
// zhengyun@ultrapower 2005.10.07
//
**********************************************************/
public void updateHeaders() {
System.out.println("/** updateHeaders */");
// 將當前新聞列表全部刪除
deleteAll();
if(m_WaitFlash == null)
{
// 當前沒有等候動畫時,我們需要創建一個
m_WaitFlash = new WaitFlash();
m_WaitFlash.setMessage("正在讀取新聞列表,請稍等...");
m_display.setCurrent(m_WaitFlash);
}
else
{
m_display.setCurrent(m_WaitFlash);
}
System.out.println("設置了等待畫面!");
if(m_curRssParser.getRssFeed().getUrl().length()>0) {
m_getPage = true;
}
}
/**********************************************************
// RssFeedOpen::deleteAll
//
// Description:
// 將當前新聞列表全部刪除
//
// Parameters:
// Return Values:
// Remark:
* 由于MIDP 2.0中才定義了List的deleteAll()方法,
* 但是MIDP1.0中List支持delete(int itemNum).
* 所以在MIDP1.0中,可以使用List的size()得到當前List中的Item的數量,
* 然后使用for循環delete(int itemNum),這樣在MIDP1.0中實現deleteAll的功能。
* 但這么for循環刪除有一個非常奇怪的地方,好像是隔一個刪一個,導致無法刪除干凈?!
* 所以最后不得不采用while循環刪除第一個元素的辦法!這也許是一個MIDP1.0的bug。
// Author:
// zhengyun@ultrapower 2005.10.07
//
**********************************************************/
// private synchronized void deleteAll()
// {
// System.out.println("!-- RssFeedOpen::Enter deleteAll --!");
//
// // 下面的刪除代碼只能隔一個刪一個m_headerList的元素,導致無法刪除干凈
// /*for(int i = 0;i < m_headerList.size();i++){
//
// m_headerList.delete(i);
// System.out.println("delete>>" + i);
// }*/
//
// // 這樣才能完全刪除:
// while(m_headerList.size()>0)
// m_headerList.delete(0);
// }
/**********************************************************
// RssFeedOpen::appendRssItem
//
// Description:
// 向List中添加Rss Item
//
// Parameters:
// Return Values:
// Remark:
*
// Author:
// zhengyun@ultrapower 2005.10.07
//
**********************************************************/
public void appendRssItem(String title)
{
setCurrentDispalyToHeaderList();
int nId = m_headerList.append(title, m_iconOpen);
System.out.println("/** appendRssItem:append item id=" + nId);
}
/**********************************************************
// RssFeedOpen::setRss
//
// Description:
// 設置當前需要去讀取哪一個Rss Feed
//
// Parameters:
* feed: 輸入feed
// Return Values:
// Remark:
*
// Author:
// zhengyun@ultrapower 2005.10.07
//
**********************************************************/
public void setRss(RssFeed feed){
m_curRssParser = new RssFeedParser( feed , controller);
m_curRssParser.openForm = this;
if( m_curRssParser.getRssFeed().getItems().size() == 0 ) {
/** Update RSS feed headers only if this is a first time */
updateHeaders();
} else {
System.out.println("/** fillHeadersList */");
/**
* Show currently selected RSS feed
* headers without updating them
*/
fillHeadersList();
}
}
/**********************************************************
// RssFeedOpen::fillHeadersList
//
// Description:
// 根據當前Rss Feed對應的類實體中存儲的Rss Item列表,重新填充界面上的List
//
// Parameters:
// Return Values:
// Remark:
*
// Author:
// zhengyun@ultrapower 2005.10.07
//
**********************************************************/
private void fillHeadersList() {
System.out.println("/** Enter fillHeadersList */");
deleteAll();
RssFeed feed = m_curRssParser.getRssFeed();
System.out.println("重新采用RssFeed:" + feed.getName());
for(int i = 0; i < m_curRssParser.getRssFeed().getItems().size(); i++){
RssItem r = (RssItem)feed.getItems().elementAt(i);
m_headerList.append( r.getTitle(), m_iconOpen );
}
// 一定要在重置了新聞列表后,把m_headerList設置為焦點,否則屏幕上會沒有效果!
setCurrentDispalyToHeaderList();
}
/**********************************************************
// RssFeedOpen::initializeHeadersList
//
// Description:
// Initialize RSS headers list
//
// Parameters:
// Return Values:
// Remark:
*
// Author:
// zhengyun@ultrapower 2005.10.07
//
**********************************************************/
private void initializeHeadersList() {
System.out.println("/** Enter initializeHeadersList */");
m_headerList = new List(SResources.FORM_TITLE_READRSSFEED, List.IMPLICIT);
m_headerList.addCommand(m_openHeaderCmd);
m_headerList.addCommand(m_backHeaderCmd);
m_headerList.addCommand(m_updateCmd);
m_headerList.setCommandListener(new RssFeedOpenListener());
}
/**********************************************************
// RssFeedOpen::run
//
// Description:
// Run method is used to get RSS feed with HttpConnection
//
// Parameters:
// Return Values:
// Remark:
*
// Author:
// zhengyun@ultrapower 2005.10.07
//
**********************************************************/
public void run(){
/* Use networking if necessary */
long lngStart;
long lngTimeTaken;
while(true) {
try {
// 我們是依靠m_getPage來判斷是否去得到并解析Rss XML的.
// 如果當前m_getPage是false,那么本線程就只能先睡眠一段時間了.
if( m_getPage ) {
try {
if(m_nErrorTextFieldId > 0)
{
this.delete(m_nErrorTextFieldId);
}
if(m_nErrorImageFieldId > 0)
{
this.delete(m_nErrorImageFieldId);
}
/** Get RSS feed */
System.out.println("/** m_curRssParser.parseRssFeed(); */");
if(m_curRssParser.parseRssFeed())
setCurrentDispalyToHeaderList();
else
{
this.addCommand(m_backHeaderCmd);
m_WaitFlash = null;
}
}catch(Exception e) {
/** Error while parsing RSS feed */
System.out.println("Error: " + e.getMessage());
errorTextField =
new TextField("RSS提示信息 : ",
"\n無法解析Rss Feed:\n" +
m_curRssParser.getRssFeed().getUrl(),
64, TextField.ANY);
this.addCommand(m_backHeaderCmd);
// 在添加元素到界面上時,必須記下插入的id,這樣下次解析RssFeed
// 時就可以先行刪除這些元素了,不至于造成重復插入
m_nErrorImageFieldId = this.append(m_iconError);
m_nErrorTextFieldId = this.append(errorTextField);
m_display.setCurrent(this);
m_WaitFlash = null;
}
m_getPage = false;
}
lngStart = System.currentTimeMillis();
lngTimeTaken = System.currentTimeMillis() - lngStart;
if(lngTimeTaken < 100)
m_netThread.sleep(75 - lngTimeTaken);
} catch (InterruptedException e) {
break;
}
}
}
/**********************************************************
// RssFeedOpen::setCurrentDispalyToHeaderList
//
// Description:
// 設置畫面到Header List
//
// Parameters:
// Return Values:
// Remark:
*
// Author:
// zhengyun@ultrapower 2005.10.07
//
**********************************************************/
public void setCurrentDispalyToHeaderList()
{
System.out.println("設置畫面到Header List!");
m_display.setCurrent(m_headerList);
if(m_WaitFlash != null)
{
// 銷毀等候動畫Form
m_WaitFlash = null;
}
}
/*
* 內部監聽器,監聽器監聽所有Command事件,并把事件響應推出來讓控制器處理
*/
private class RssFeedOpenListener implements CommandListener{
public void commandAction(Command command, Displayable disp){
if(command == m_backHeaderCmd){
System.out.println("Back Menu!");
controller.handleEvent(GUIController.EventID.EVENT_VIEW_BACK,null);
}
else if(command == m_openHeaderCmd || (command == List.SELECT_COMMAND &&
m_display.getCurrent() == m_headerList)){
int ind = ((List)disp).getSelectedIndex();
if(ind == -1)
return;
Object[] args = {m_curRssParser.getRssFeed().getItems().elementAt(ind)};
controller.handleEvent(GUIController.EventID.EVENT_VIEW_RSS_ITEM,args);
}
else if(command == m_updateCmd){
int ind = ((List)disp).getSelectedIndex();
if(ind == -1)
return;
Object[] args={m_curRssParser.getRssFeed().getItems().elementAt(ind)};
controller.handleEvent(GUIController.EventID.EVENT_UPDATE_RSS_ITEMS,args);
}
}
}//end inner class
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -