Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用ProgressDialog在AsyncTask中包装新闻解析器_Android_Android Asynctask - Fatal编程技术网

Android 使用ProgressDialog在AsyncTask中包装新闻解析器

Android 使用ProgressDialog在AsyncTask中包装新闻解析器,android,android-asynctask,Android,Android Asynctask,所以我设置了这个解析代码,我得到了NetworkOnMainThreadException,所以我想把它包装在一个AsyncTask中,但我不确定放什么和放在哪里 我已经阅读了一些关于AsyncTask的教程,但是它们都有点让人困惑,我想知道是否有人能指出我应该把我现在的模块放在哪里: noticeas.java(main活动): 谢谢您的时间。只需将连接部分放在doInBackground中,并将修改ui的部分放在onPostExecute中即可 示例(需要仔细检查): 私有类下载文件任务扩展

所以我设置了这个解析代码,我得到了NetworkOnMainThreadException,所以我想把它包装在一个AsyncTask中,但我不确定放什么和放在哪里

我已经阅读了一些关于AsyncTask的教程,但是它们都有点让人困惑,我想知道是否有人能指出我应该把我现在的模块放在哪里:

noticeas.java(main活动):


谢谢您的时间。

只需将连接部分放在
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();
}