0

AsyncTask を使用して、RSS フィードと DOM パーサーと ArrayAdapter からデータを取得しています。

RSS フィードを読み込んで画面にデータを表示するのに時間がかかりすぎることに気付きました。最初は記事の数が多いためと考えていましたが、for ループを制限して 3 つの記事のみを読み取ると、記事を表示するのに時間がかかりすぎました。 !!

以下は、データと主なアクティビティを解析するために使用している完全なコードです

主な活動コード:

public class NewsMainActivity extends Activity implements OnItemClickListener {
    /** Called when the activity is first created. */

    ListView listview;
    List<NewsBean> arrayList;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //Remove title bar
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.main);

        initComponents();

        if (Utils.isNetworkAvailable(this)) {
            new MyRssReadTask()
                    .execute("feed_URL");

        } else {
            Toast.makeText(this, "Please check your internet connection", Toast.LENGTH_SHORT)
                    .show();
        }

    }

    private void initComponents() {
        listview = (ListView) findViewById(android.R.id.list);
        listview.setOnItemClickListener(this);

    }

    class MyRssReadTask extends AsyncTask<String, Void, Void> {
        ProgressDialog waitingDialog;

        @Override
        protected void onPreExecute() {
            waitingDialog = new ProgressDialog(NewsMainActivity.this);
            waitingDialog.setMessage("Loading articles, Please wait...");
            waitingDialog.show();
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(String... urls) {

            arrayList = new NewsParser().getData(urls[0]);

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            waitingDialog.dismiss();
            setDataToListView();
            super.onPostExecute(result);
        }
    }

    protected void setDataToListView() {
        if (null != arrayList && arrayList.size() != 0) {
            NewsRowAdapter objNewsRowAdapter = new NewsRowAdapter(
                    NewsMainActivity.this, R.layout.row, arrayList);

            listview.setAdapter(objNewsRowAdapter);
        } else {
            showToast("There was an error to get data, please try again later.");
        }

    }

    void showToast(String msg) {
        Toast.makeText(NewsMainActivity.this, msg, Toast.LENGTH_SHORT).show();
    }

    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {

        final NewsBean objBean = (NewsBean) arrayList.get(position);
        Intent intent = new Intent(NewsMainActivity.this,
                NewsDetail.class);

        intent.putExtra("title", objBean.getTitle());
        intent.putExtra("description", objBean.getDescription());
        //intent.putExtra("pubdate", objBean.getPubDate());
        //intent.putExtra("creator", objBean.getCreator());
        intent.putExtra("link", objBean.getLink());

        startActivity(intent);
    }

ニュースパーサー

public class NewsParser {


    private List<NewsBean> arrayListPasre;

    public List<NewsBean> getData(String _url) {
        try {

            arrayListPasre = new ArrayList<NewsBean>();
            URL url = new URL(_url);
            URLConnection con = url.openConnection();

            System.out.println("Connection is : " + con);

            System.out.println("Connection InputStream is : "
                    + con.getInputStream());

            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    con.getInputStream()));
            System.out.println("Reader us now : " + reader);

            String inputLine;
            String fullStr = "";
            while ((inputLine = reader.readLine()) != null)
                fullStr = fullStr.concat(inputLine + "\n");

            InputStream istream = url.openStream();

            DocumentBuilder builder = DocumentBuilderFactory.newInstance()
                    .newDocumentBuilder();

            System.out.println("Builder : " + builder);

            Document doc = builder.parse(istream);

            doc.getDocumentElement().normalize();

            NodeList nList = doc.getElementsByTagName("item");

            System.out.println("nlist " + nList);

            for (int temp = 0; temp < 3; temp++) {

                Node nNode = nList.item(temp);
                if (nNode.getNodeType() == Node.ELEMENT_NODE) {

                    Element eElement = (Element) nNode;

                    NewsBean objBean = new NewsBean();

                    objBean.setTitle(getTagValue("title", eElement));
                    objBean.setDescription(getTagValue("description", eElement));
                    objBean.setLink(getTagValue("link", eElement));
                    arrayListPasre.add(objBean);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return arrayListPasre;
    }

    private String getTagValue(String sTag, Element eElement) {
        NodeList nlList = eElement.getElementsByTagName(sTag).item(0)
                .getChildNodes();

        Node nValue = (Node) nlList.item(0);

        return nValue.getNodeValue();

    }
}

どんな提案でも感謝します!! :)

4

1 に答える 1

1

一度に rss 全体を解析する必要はありません。これは部分的に行うことができます。たとえば、ドキュメントを解析し、RSS アイテム数を取得してから、3、5、または 10 アイテムのみの非同期タスクを呼び出します。onPostExecute() で結果をアダプターに追加し、notifydatasetchanged() を呼び出します。

于 2012-08-13T00:03:12.933 に答える