1

我正在尝试将一些网站的代码下载到我的应用程序中,如下所示:

 public void wypned(final View pwn) throws IllegalStateException, IOException{
    HttpClient httpClient = new DefaultHttpClient();
    HttpContext localContext = new BasicHttpContext();
    HttpGet httpGet = new HttpGet("http://example.com");
    HttpResponse response = httpClient.execute(httpGet, localContext);
    String result = "";

    BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent() ) );

    String line = null;
    while ((line = reader.readLine()) != null){
    result += line + "\n";
    }
}

我得到的只是致命错误。LogCat 说:

Caused by: android.os.NetworkOnMainThreadException
 on Android 3.x and up, you can't do network I/O on the main thread

有人可以告诉我如何解决吗?我试图用线程做一些事情,但没有成功。

4

2 回答 2

2

为此实现一个 asyncTask :

public class MyAsyncTask extends AsyncTask<Void, Void, Result>{

                        private Activity activity;
                        private ProgressDialog progressDialog;

            public MyAsyncTask(Activity activity) {
                            super();
                this.activity = activity;
            }

            @Override
            protected void onPreExecute() {
            super.onPreExecute();
                progressDialog = ProgressDialog.show(activity, "Loading", "Loading", true);
            }

            @Override
            protected Result doInBackground(Void... v) {
            //do your stuff here
            return null;

            }

            @Override
            protected void onPostExecute(Result result) {
                progressDialog.dismiss();
                Toast.makeText(activity.getApplicationContext(), "Finished.", 
                        Toast.LENGTH_LONG).show();
            }


}

从活动中调用它:

MyAsyncTask task = new AsyncTask(myActivity.this);
task.execute();
于 2012-08-20T16:56:54.427 回答
0

所有网络操作(因为它们是阻塞的)都应该在一个单独的线程上完成。Android 开发指南建议这样做。

android.os.NetworkOnMainThreadException

当应用程序尝试在其主线程上执行网络操作时引发的异常。

这仅针对面向 Honeycomb SDK 或更高版本的应用程序抛出。允许以早期 SDK 版本为目标的应用程序在其主事件循环线程上进行网络连接,但非常不鼓励这样做。

为您的网络操作创建一个单独的线程,它基本上告诉您。

可能长时间运行的操作(如网络或数据库操作)或计算量大的计算(如调整位图大小)应在子线程中完成

来源 1 来源 2

于 2012-08-20T16:55:21.493 回答