Android:从互联网站点检索信息

时间:2014-07-05 18:50:06

标签: java android

我的目标是从Wall Street Journal网站(http://online.wsj.com/home-page)中检索标题,然后只需按一下按钮即可将其添加到我的应用程序中。以下是我到目前为止所做的事情:

public class NewsFeed extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstasnceState);
        setContentView(R.layout.activity_newsfeed);

        HttpGet httpGet = new HttpGet('http://online.wsj.com/home-page');
        final String headline = String.valueOf(httpGet);

        button1.setOnClickListener (new View.OnClickListener() {
            @Override
            public void onClick (View v) {
                textview1.setText(headline);
            }
       });

    }

}

如何更改我的代码以便正确显示网站信息?

8 个答案:

答案 0 :(得分:3)

首先,您需要下载HTML。您可以使用名为AsyncHttpClient http://loopj.com/android-async-http/

的框架执行此操作

然后你需要解析HTML标题,应该像h1的内容,因此你需要像http://jsoup.org/这样的HTML解析器

答案 1 :(得分:1)

如果只是将URI传递给HttpGet,则无法获取响应字符串。您可以参考以下stackoverflow URL来了解如何使用HttpGet&检索响应: How do I use the Simple HTTP client in Android?

此外,如果在主UI线程上执行任何长时间运行的操作,则可能导致ANR。因此,为避免在单独的线程,执行程序等中执行此操作,您可以使用IntentService或AsyncTask或Service with Thread。否则,一种简单的方法是使用任何第三方库,如Volley,Facebook Bolt等。

答案 2 :(得分:1)

使用像Mapo所说的http://loopj.com/android-async-http/,或者如果你觉得使用过于复杂https://code.google.com/p/android-query/

我会选择第一个,因为它支持更多,重试等。 如果您想要图像,Facebook / Twitter集成等非常容易,Android查询是好的

答案 3 :(得分:1)

这是一个没有任何外国图书馆的简单概念证明:

        new AsyncTask<String, Integer, String>(){

        @Override
        protected String doInBackground(String... params) {
            try {
                // get HTTP Data
                HttpClient client = new DefaultHttpClient();
                HttpResponse response = client.execute(new HttpGet(params[0])); // We only support the first param 
                String html = EntityUtils.toString(response.getEntity());

                Matcher m = Pattern.compile("<title>(.*?)</title>").matcher(html);
                if(m.find()){
                    Log.i("HeadLine", m.group(1));
                    return m.group(1);
                }

            } catch (Exception e) {
                Log.e("e", e.getMessage(),e);
            }

            // nothing found or an exception occurred
            return null;
        }
        @Override
        protected void onPostExecute(String result) {
            // update your view with the value
            super.onPostExecute(result);
        }

    }.execute("http://online.wsj.com/home-page");

你一定要弄清楚细节,但我相信你可以自己做出来。

答案 4 :(得分:1)

抓取relevant feedparse it,如下所示:

URL url = new URL("http://example.com/feed.rss");
RssFeed feed = RssReader.read(url);

ArrayList<RssItem> rssItems = feed.getRssItems();
for(RssItem rssItem : rssItems) {
    Log.i("RSS Reader", rssItem.getTitle());
}

而不是解析通常混乱且易于更改的HTML,而不是使用存在供您使用的XML。

答案 5 :(得分:1)

您可以使用JSOUP

  //Get the HTML
  Document doc = Jsoup.connect("http://online.wsj.com/europe").get();
  //Get the Headlines
  Elements headlines = doc.select("h2.tipTarget");

  for (Element e : headlines) {
     String headline = e.text();

  }

为避免异常,您必须在其他线程中执行先前的代码。例如:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstasnceState);
        setContentView(R.layout.activity_newsfeed);
        new GetHeadLines().execute();
}


private class GetHeadLines extends AsyncTask<Void, Void, Elements> {

    protected Elements doInBackground(Void... params) {
      //Get the HTML
      Document doc = Jsoup.connect("http://online.wsj.com/europe").get();
      //Get the Headlines
      Elements headlines = doc.select("h2.tipTarget");

      return headlines;
 }

   protected void onPostExecute(Elements headlines) {
        for (Element h : elements) {
                String headline = h.text();
                //Do stufs
        }
    }
}

答案 6 :(得分:0)

HTTPGet只是一个对象,这就是为什么你会得到一个神秘的&#34;信息。你需要执行

httpGet.getMethod();

你得到一个字符串。您还应该查看HTTPGet APi

答案 7 :(得分:0)

您没有执行HttpGet

        HttpClient httpclient = new DefaultHttpClient();
        HttpGet method = new HttpGet("http://online.wsj.com/home-page");
        HttpResponse response = httpclient.execute(method);

请尝试此链接 - HttpClient.execute(HttpPost) on Android 4.2 error