我测试了这段代码,它在2.2和2.3.3上工作正常,但它在4.0上崩溃。
问题似乎与http请求有关。有什么想法吗?
public class Rezultat extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
//http post
InputStream is=null;
try{
String url="http://google.com";
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
}catch(Exception e){
Log.e("log_tag", "Error in http connection "+e.toString());
}
//convert response to string
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result=sb.toString();
}catch(Exception e){
Log.e("log_tag", "Error converting result "+e.toString());
}
答案 0 :(得分:3)
e.printstacktrace()会告诉你:
http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html
应用程序尝试执行时抛出的异常 在其主线程上进行网络操作。
这仅适用于针对Honeycomb SDK或。的应用程序 更高。允许使用早期SDK版本的应用程序 他们的主要事件循环线程上的网络,但它是很重要的 泄气。请参阅文档设计响应性。
private class DownloadFromUrlTask extends AsyncTask<String, Void, Bitmap> {
protected void onPreExecute() {
mDialog = ProgressDialog.show(ChartActivity.this,"Please wait...", "Retrieving data ...", true);
}
protected String doInBackground(String... urls) {
//All your network stuff here.
return result
}
}
答案 1 :(得分:1)
您正在主线程上执行(可能很慢)网络操作。如果您的目标SDK为11或更高,则会抛出NetworkOnMainThreadException
,因为此行为可能会阻止用户界面并导致应用无响应。
您可以使用AsyncTask
解决此问题,将数据加载到doInBackground(..)
。
答案 2 :(得分:1)
通常应该在询问崩溃时发布堆栈跟踪,但在这种情况下,您在主UI线程上执行网络操作。不推荐这样做,现在抛出异常。而是在另一个线程中执行,可能通过AsyncTask。