我在网上发现我们可以使用HttpClient和HttpGet对象使用java下载页面的源代码。但是,每当我尝试这样做时,我的IDE(Eclipse)都要求我用try / catch块包围一些代码行,除非我这样做,否则它不会编译。但话说回来,当我用try / catch块包围这些行时,一些变量超出了范围而引发了另一个错误。 这是正在发生的事情 -
package com.example.prs;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
public class PrsActivity extends Activity {
private TextView title;
private String url = "http://www.google.com";
private String pageHtml;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_prs);
title = (TextView) findViewById(R.id.title);
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
HttpResponse response = client.execute(request); // asks to add try/catch block here
String html = "";
InputStream in = response.getEntity().getContent(); //asks to add try/catch block here
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder str = new StringBuilder();
String line = null;
while((line = reader.readLine()) != null) // asks to add try/catch block here
{
str.append(line);
}
in.close(); // asks to add try/catch block here
html = str.toString();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_prs, menu);
return true;
}
}
当我添加try / catch块时,会出现这些错误 -
package com.example.prs;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
public class PrsActivity extends Activity {
private TextView title;
private String url = "http://www.google.com";
private String pageHtml;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_prs);
title = (TextView) findViewById(R.id.title);
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
HttpResponse response;
try {
response = client.execute(request);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String html = "";
InputStream in;
try {
in = response.getEntity().getContent(); //"response" goes out of scope
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder str = new StringBuilder();
String line = null;
try {
while((line = reader.readLine()) != null)
{
str.append(line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
in.close(); //"in" goes out of scope
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
html = str.toString();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu`enter code here`.activity_prs, menu);
return true;
}
}
请帮我解决这个问题。提前谢谢。
答案 0 :(得分:0)
纯粹作为语法问题,以下是修复异常问题的方法:
package com.example.prs;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class PrsActivity extends Activity {
private TextView title;
private String url = "http://www.google.com";
private String pageHtml;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_prs);
title = (TextView) findViewById(R.id.title);
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
try {
HttpResponse response = client.execute(request); // asks to add
// try/catch
// block here
String html = "";
InputStream in = response.getEntity().getContent(); // asks to add
// try/catch
// block here
BufferedReader reader = new BufferedReader(
new InputStreamReader(in));
StringBuilder str = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) // asks to add try/catch
// block here
{
str.append(line);
}
in.close(); // asks to add try/catch block here
html = str.toString();
} catch (IOException err) {
Log.e(PrsActivity.class.getSimpleName(), err.toString(), err);
}
}
}
然而,正如邹邹在评论中指出的那样,这仍然无效,因为你试图在主线程中执行网络请求。您需要创建AsyncTask
并在那里执行网络请求。
请参阅this answer,了解如何创建AsyncTask
。