在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();