Android 使用ProgressDialog在AsyncTask中包装新闻解析器
所以我设置了这个解析代码,我得到了NetworkOnMainThreadException,所以我想把它包装在一个AsyncTask中,但我不确定放什么和放在哪里 我已经阅读了一些关于AsyncTask的教程,但是它们都有点让人困惑,我想知道是否有人能指出我应该把我现在的模块放在哪里: noticeas.java(main活动):Android 使用ProgressDialog在AsyncTask中包装新闻解析器,android,android-asynctask,Android,Android Asynctask,所以我设置了这个解析代码,我得到了NetworkOnMainThreadException,所以我想把它包装在一个AsyncTask中,但我不确定放什么和放在哪里 我已经阅读了一些关于AsyncTask的教程,但是它们都有点让人困惑,我想知道是否有人能指出我应该把我现在的模块放在哪里: noticeas.java(main活动): 谢谢您的时间。只需将连接部分放在doInBackground中,并将修改ui的部分放在onPostExecute中即可 示例(需要仔细检查): 私有类下载文件任务扩展
谢谢您的时间。只需将连接部分放在
doInBackground
中,并将修改ui的部分放在onPostExecute
中即可
示例(需要仔细检查):
私有类下载文件任务扩展异步任务{
私人语境;
公共下载文件任务(上下文){
this.context=上下文;
}
受保护的void onPreExecute(){
progressDialog=progressDialog.show(上下文“,”消息“,”真);
}
受保护的长doInBackground(URL…URL){
XMLParser=新的XMLParser();
字符串xml=parser.getXmlFromUrl(URL);
Document doc=parser.getdoElement(xml);
NodeList nl=doc.getElementsByTagName(键项);
字符串数据[]=新字符串[nl.getLength()];
对于(int i=0;i0){
System.out.println(“Há”+日差+”直径,Δs“+当日时间);
数据[i]=(“Há”+日差+“直径”,a s”+日时);
}否则如果(小时数>0){
System.out.println(“Há”+hourDiff+“hora(s),ás”+时间段);
数据[i]=(“Há”+小时数+“时数”,秒数+时间);
}否则如果(分钟间隔>0){
System.out.println(“Há”+分钟敌我识别码+“分钟到”,秒“+一天的时间);
数据[i]=(“Há”+分钟敌我识别码+“分钟”,秒“+一天的时间);
}else if(secondDiff>0){
System.out.println(“Há”+secondDiff+“segundo(s)”、a s“+时间段);
数据[i]=(“Há”+secondDiff+“segundo(s),a s”+时间段);
}
}捕获(解析异常e1){
e1.printStackTrace();
}catch(java.text.ParseException e1){
e1.printStackTrace();
}
//Html.fromHtml以获取描述
put(KEY_TITLE,Html.fromHtml(parser.getValue(e,KEY_TITLE));
put(KEY_DESC,Html.fromHtml(parser.getValue(e,KEY_DESC));
map.put(KEY_PUBDATE,Html.fromHtml(数据[i]);
put(KEY_-LINK,Html.fromHtml(parser.getValue(e,KEY_-LINK));
menuItems.add(地图);
}//结束
}
受保护的void onPostExecute(长结果){
progressDialog.disclose();
//使用ListAdapter就足够了,不需要自定义适配器
ListAdapter=new SimpleAdapter(此、菜单项、R.layout.linhafeed、,
新字符串[]{KEY_TITLE,KEY_DESC,KEY_PUBDATE,KEY_LINK},
新的int[]{R.id.title,R.id.desc,R.id.pub,R.id.link});
setListAdapter(适配器);
}
}
一旦创建:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_noticias);
ArrayList<HashMap<String, Spanned>> menuItems = new ArrayList<HashMap<String, Spanned>>
();
new DownloadFilesTask(this).execute();
}
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u noticias);
ArrayList menuItems=新建ArrayList
();
新建下载文件任务(this.execute();
}
所以我只需要将main活动
包装在AsyncTask
中,也不需要在XMLParser
上完成,对吗?关于ProgressDialog
,我应该把它放在哪里?好的,你可以把它放在ProgressDialog的代码组织中(如果你想的话)在onPreExecute中初始化它,在onpostExecute中取消它最后一件事,我是把你写的块放在onCreate
中还是作为一个单独的类?你能编辑你的代码块来匹配我原来的代码块吗?我问这个问题主要是为了了解它的去向,以及它是否以这种方式工作,以便我可以在其他地方使用它;
public class XMLParser {
// constructor
public XMLParser() {
}
/**
* Getting XML from URL making HTTP request
* @param url string
* */
public String getXmlFromUrl(String url) {
String xml = null;
try {
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
xml = EntityUtils.toString(httpEntity);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// return XML
return xml;
}
/**
* Getting XML DOM element
* @param XML string
* */
public Document getDomElement(String xml){
Document doc = null;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(xml));
doc = db.parse(is);
} catch (ParserConfigurationException e) {
Log.e("Error: ", e.getMessage());
return null;
} catch (SAXException e) {
Log.e("Error: ", e.getMessage());
return null;
} catch (IOException e) {
Log.e("Error: ", e.getMessage());
return null;
}
return doc;
}
/** Getting node value
* @param elem element
*/
public final String getElementValue( Node elem ) {
if( elem != null){
return elem.getTextContent();
}
return "";
}
/**
* Getting node value
* @param Element node
* @param key string
* */
public String getValue(Element item, String str) {
NodeList n = item.getElementsByTagName(str);
return this.getElementValue(n.item(0));
}
}
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
private Context context;
public DownloadFilesTask(Context context) {
this.context = context;
}
protected void onPreExecute() {
progressDialog = ProgressDialog.show(context, "", "msg", true);
}
protected Long doInBackground(URL... urls) {
XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(URL);
Document doc = parser.getDomElement(xml);
NodeList nl = doc.getElementsByTagName(KEY_ITEM);
String data[] = new String[nl.getLength()];
for (int i = 0; i < nl.getLength(); i++) {
HashMap<String, Spanned> map = new HashMap<String, Spanned>();
Element e = (Element) nl.item(i);
//Date Conversion
data[i] = getTagValue("pubDate", e);
SimpleDateFormat sdf = new SimpleDateFormat("EE, dd MMM yyyy HH:mm:ss z", Locale.UK);
Date date = null;
try {
date = sdf.parse(data[i]);
String timeOfDay = new SimpleDateFormat("HH:mm").format(date);
java.sql.Timestamp timeStampDate = new Timestamp(date.getTime());
java.sql.Timestamp timeStampNow = new Timestamp((new java.util.Date()).getTime());
long secondDiff = timeStampNow.getTime() / 1000 - timeStampDate.getTime() / 1000;
int minuteDiff = (int) (secondDiff / 60);
int hourDiff = (int) (secondDiff / 3600);
int dayDiff = daysBetween(date, new Date());
if (dayDiff > 0) {
System.out.println("Há " + dayDiff + " dia(s), às " + timeOfDay);
data[i] = ("Há " + dayDiff + " dia(s), às " + timeOfDay);
} else if (hourDiff > 0) {
System.out.println("Há " + hourDiff + " hora(s), às " + timeOfDay);
data[i] = ("Há " + hourDiff + " hora(s), às " + timeOfDay);
} else if (minuteDiff > 0) {
System.out.println("Há " + minuteDiff + " minuto(s), às " + timeOfDay);
data[i] = ("Há " + minuteDiff + " minuto(s), às " + timeOfDay);
} else if (secondDiff > 0) {
System.out.println("Há " + secondDiff + " segundo(s), às " + timeOfDay);
data[i] = ("Há " + secondDiff + " segundo(s), às " + timeOfDay);
}
} catch (ParseException e1) {
e1.printStackTrace();
} catch (java.text.ParseException e1) {
e1.printStackTrace();
}
//Html.fromHtml to get <CDATA> Description
map.put(KEY_TITLE, Html.fromHtml(parser.getValue(e, KEY_TITLE)));
map.put(KEY_DESC, Html.fromHtml(parser.getValue(e, KEY_DESC)));
map.put(KEY_PUBDATE, Html.fromHtml(data[i]));
map.put(KEY_LINK, Html.fromHtml(parser.getValue(e, KEY_LINK)));
menuItems.add(map);
} //endFOR
}
protected void onPostExecute(Long result) {
progressDialog.dismiss();
//Using ListAdapter is enough for this, no need for Custom Adapter
ListAdapter adapter = new SimpleAdapter(this, menuItems, R.layout.linhafeed,
new String[] { KEY_TITLE, KEY_DESC, KEY_PUBDATE, KEY_LINK },
new int[] { R.id.title, R.id.desc, R.id.pub, R.id.link });
setListAdapter(adapter);
}
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_noticias);
ArrayList<HashMap<String, Spanned>> menuItems = new ArrayList<HashMap<String, Spanned>>
();
new DownloadFilesTask(this).execute();
}