在Android中通过创建URL来读取网络数据时,MainActivity中如下:
try { InputStream in=new URL("http://www.baidu.com").openStream(); //读取网络数据 BufferedReader reader=new BufferedReader(new InputStreamReader(in,"utf-8")); String line=null; //创建一行的数据 StringBuffer content=new StringBuffer(); //呈现所有行的数据 while((line=reader.readLine())!=null){ content.append(line); //添加每行的数据 } reader.close(); //或者:in.close(); System.out.println(content.toString()); } catch (IOException e) { e.printStackTrace(); }
运行时程序会发生错误,这是因为网络请求在主线程里面。而在Android平台中,如果执行了网络请求,是不能够写在主线程中的。
要修改上面的代码,将之放在一个辅线程里面,则需要使用AsyncTask,MainActivity中:
new AsyncTask<Void,Void,Void>(){ @Override protected Void doInBackground(Void... arg0) { try { InputStream in=new URL("http://www.baidu.com").openStream(); //读取网络数据 BufferedReader reader=new BufferedReader(new InputStreamReader(in,"utf-8")); String line=null; //创建一行的数据 StringBuffer content=new StringBuffer(); //呈现所有行的数据 while((line=reader.readLine())!=null){ content.append(line); //添加每行的数据 } reader.close(); //或者:in.close(); System.out.println(content.toString()); } catch (IOException e) { e.printStackTrace(); } return null; //返回参数为Void类型 } }.execute();此时运行程序仍会发生错误,因为未拥有Internet的权限。
打开AndroidManifest.xml,添加Internet的权限:
<uses-permission android:name="android.permission.INTERNET"/>运行程序,即可在控制台上输出所加载的网络数据信息。
若想将数据直接呈现在UI控件中,在程序中写一个TextView:
private TextView tv;MainActivity中:
tv=(TextView) findViewById(R.id.tv); new AsyncTask<Void,Void,String>(){ @Override protected String doInBackground(Void... arg0) { try { InputStream in=new URL("http://www.baidu.com").openStream(); //读取网络数据 BufferedReader reader=new BufferedReader(new InputStreamReader(in,"utf-8")); String line=null; //创建一行的数据 StringBuffer content=new StringBuffer(); //呈现所有行的数据 while((line=reader.readLine())!=null){ content.append(line); //添加每行的数据 } reader.close(); //或者:in.close(); return content.toString(); //返回值为读取的数据 } catch (IOException e) { e.printStackTrace(); } return null; //返回参数为Void类型 } @Override protected void onPostExecute(String s){ super.onPostExecute(s); if(s!=null){ //s!=null时成功读取到服务器端的数据 tv.setText(s); } } }.execute();