我在Android上编写代码来获取请求,但我的错误是这样的:
07-07 21:12:39.674: E/AndroidRuntime(2409): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
所以我读到我必须使用AsyncTask。我做的。有一段时间它运行良好,但下次我运行应用程序,我再次遇到了这个错误。
这是我的代码:
package app.teksty;
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.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
public class MainActivity extends Activity {
private class HttpGetRequest extends AsyncTask<String, Integer, Void>
{
private InputStream content;
@Override
protected Void doInBackground(String... params) {
String url = params[0];
Log.i("[GET REQUEST]", "STARTED");
try {
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = httpclient.execute(new HttpGet(url));
content = response.getEntity().getContent();
} catch (Exception e) {
Log.e("[GET REQUEST]", "Network exception", e);
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
BufferedReader r = new BufferedReader(new InputStreamReader(content));
StringBuilder respond = new StringBuilder();
String line;
try {
while ((line = r.readLine()) != null) {
respond.append(line);
}
Log.i("[GET REQUEST]", respond.toString());
} catch (IOException e) {
Log.e("[GET REQUEST]", "", e);
}
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new HttpGetRequest().execute("http://www.google.pl");
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
我做错了什么或我有什么解决这个问题?
答案 0 :(得分:6)
尝试将此代码放入方法onCreate()
:
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
但是这仅适用于构建sdk版本9及更高版本
答案 1 :(得分:4)
在使用Inputstream时,您正在使用主线程,这就像在网络上工作一样。阅读doInBackground()处理程序中的全部内容,你应该没问题
答案 2 :(得分:0)
onPostExecute()
方法在主UI线程上运行。您没有在其中使用任何UI元素,那么为什么要在UI线程中包含所有这些语句。只需在返回语句之前将所有这些语句移动到doInBackground()
,并尝试是否有效。