0

我测试了这段代码,它在 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());
    }
4

3 回答 3

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
    }
}
于 2012-12-18T20:16:17.460 回答
1

您正在主线程上执行(可能很慢)网络操作。如果您的目标 SDK 是 11 或更高版本,则会抛出NetworkOnMainThreadException,因为此行为可能会阻塞 UI 并导致应用程序无响应。

您可以使用 anAsyncTask来解决这个问题,将数据加载到其doInBackground(..).

于 2012-12-18T20:15:51.923 回答
1

您通常应该在询问崩溃时发布您的堆栈跟踪,但在这种情况下,您是在主 UI 线程上执行网络操作。不建议这样做,现在会引发异常。而是在另一个线程中执行它,可能通过 AsyncTask。

于 2012-12-18T20:16:07.103 回答