Android 使用 URL 和 AsyncTask 加载网络数据

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



你可能感兴趣的:(Android 使用 URL 和 AsyncTask 加载网络数据)