我的目标是从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);
}
});
}
}
如何更改我的代码以便正确显示网站信息?
答案 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 feed和parse 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)
答案 7 :(得分:0)
您没有执行HttpGet
!
HttpClient httpclient = new DefaultHttpClient();
HttpGet method = new HttpGet("http://online.wsj.com/home-page");
HttpResponse response = httpclient.execute(method);