我制作的Android应用程序必须从页面http://example.com/get.php?id=1接收数据。为此,我使用以下方法:
private String getData()
{
HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext(); // !!! application stops here
HttpGet httpGet = new HttpGet("http://example.com/get.php?id=1");
HttpResponse response = null;
try {
response = httpClient.execute(httpGet, localContext);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String result = "";
BufferedReader reader = null;
try {
reader = new BufferedReader(
new InputStreamReader(
response.getEntity().getContent()
)
);
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String line = null;
try {
while ((line = reader.readLine()) != null){
result += line + "\n";
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Now you have the whole HTML loaded on the result variable
return result;
}
我还添加了AndroidManifest.xml的权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.repetitor_ent_free"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.INTERNET" />
问题是当我在设备上运行应用程序时出现错误: 意外停止应用程序MyApp(进程com.android.myapp)。请再试一次。
答案 0 :(得分:2)
您有android.os.NetworkOnMainThreadException
,如果您希望更好的解决方案尝试使用AsyncTask。有关线程的更多信息,请查看“processes and threads”(请仔细阅读本指南以避免将来出现此问题)。
例如,您可以尝试以下解决方案之一:
1)使用Roman的答案并添加如下内容:
final StringBuilder sb = ... ;
final TextView tv = ... ;
tv.post(new Runnable() {
public void run() {
tv.setText(sb.toString());
}
});
或使用活动方法:
runOnUiThread(new Runnable() {
public void run() {
final StringBuilder sb = ... ;
final TextView tv = ... ;
tv.setText(sb.toString());
}
});
2)使用AsyncTask:
new AsyncTask<Void, Void, Void> () {
protected Void doInBackground(Void... none) {
//
// your code
//
return null;
}
protected void onProgressUpdate(Void... none) {}
protected void onPostExecute(Void none) {
// use this to set the text
final StringBuilder sb = ... ;
final TextView tv = ... ;
tv.setText(sb.toString());
}
}.execute();
答案 1 :(得分:1)
尝试使用它:
new Thread(){
@Owerride
public void run(){
URL url = new URL(urlString);
URLConnection conn = url.openConnection();
InputStreamReader streamReader = new InputStreamReader(conn.getInputStream());
BufferedReader br = new BufferedReader(streamReader);
StringBuilder sb = new StringBuilder();
String line = null;
while((line = br.readLine()) != null) {
sb.append(line);sb.append("\n");
}
}
}.start();
答案 2 :(得分:1)
您可以尝试以下代码:
HttpURLConnection conn = null;
try {
URL url = new URL("http://example.com/get.php?id=1");
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-length", "0");
conn.setUseCaches(false);
conn.setAllowUserInteraction(false);
conn.connect();
InputStreamReader streamReader = new InputStreamReader(conn.getInputStream());
//Do what you need with the data here
} catch (Exception e) {
// Handle your exceptions
} finally {
if (conn != null) {
conn.disconnect();
conn = null;
}
}
}