• Android 使用 HttpClient 从服务器获取数据

    使用网络的第一个例子
    服务器君一共花费 8.668 ms 进行了 4 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    用Handler实现线程间的消息通信 这个小节里,我们的初衷是,点击按钮,然后启动 LoadPicThread 线程,从网上获取数据,再把数据更新到 TextView 里。但是因为那会我们主要讲的是线程,所以把网络这一块忽略了,仅仅用一个 String 来代替服务器返回的内容。

    这里开始讲 Http 了,所以第一步,就是把那个小例子补充完毕,变成真正能从网络访问数据。

    如果有 Java 的 HttpClient 使用经验,那么这一块就很简单了,下面是直接给小例子的代码:

    private TextView ptv;
    private Button btn_next;
    
    private Handler pic_hdl;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    	// TODO Auto-generated method stub
    	super.onCreate(savedInstanceState);
    	setContentView(R.layout.painting);
    	
    	ptv = (TextView)findViewById(R.id.ptv);
    	btn_next = (Button)findViewById(R.id.btn_loadnext);
    	
    	btn_next.setOnClickListener(new ButtonListener());
    	
    	pic_hdl = new PicHandler();
    }
    
    class ButtonListener implements OnClickListener{
    
    	@Override
    	public void onClick(View v) {
    		// TODO Auto-generated method stub
    		if( v.getId() == R.id.btn_loadnext){
    			Thread t = new LoadPicThread();
    			t.start();
    		}
    	}
    	
    }
    
    class LoadPicThread extends Thread{
    	@Override
    	public void run(){
    		HttpClient httpClient = new DefaultHttpClient();
    		HttpGet httpGet = new HttpGet("http://www.nowamagic.net/academy/android/");
    		try {
    			HttpResponse rsp = httpClient.execute(httpGet);
    			int code = rsp.getStatusLine().getStatusCode();
    			if( code == 200 ){
    				HttpEntity entity = rsp.getEntity();
    				InputStream is = entity.getContent();
    				BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    				String s = reader.readLine();
    				
    				Message msg = pic_hdl.obtainMessage();
    				msg.obj = "已从服务器获取的数据:"+ s;
    				pic_hdl.sendMessage(msg);
    			}
    				
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    	}
    }
    
    class PicHandler extends Handler{
    
    	@Override
    	public void handleMessage(Message msg) {
    		// TODO Auto-generated method stub
    		String s = (String)msg.obj;
    		ptv.setText(s);
    	}
    	
    }
    

    关键是 LoadPicThread 里的代码,我们简单介绍一下:

    1. 在面向对象的世界里,一切都用对象表示。
    2. HttpClient 代表客户端的对象,HttpGet 代表请求的对象,HttpResponse 代表服务器响应的对象,HttpEntity 代表返回的数据的实体对象,然后用流的方式将数据读取。
    3. 呃……就这么多,没第三条了。

    App 运行效果:

    差点忘了,需要在 Manifest.xml 里加上这么一句(授权访问网络)才能访问网络:

    <uses-permission android:name="android.permission.INTERNET" />
    
更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [移动开发] 使用support-v7 ActionBar前的那些坑 3 个条目
  2. [Python程序设计] Python语言概述 6 个条目
  3. [移动开发] Android 网络通信框架Volley 1 个条目
  4. [智力开发与知识管理] 整体性学习策略 9 个条目
  5. [移动开发] Android属性系统Property 9 个条目
  6. [搜索引擎优化] 与百度权重有关的信息 2 个条目
  7. [搜索引擎优化] 百度搜索引擎优化指南 3 个条目
  8. [Python程序设计] Tornado背景知识介绍 4 个条目
  9. [软件工程与项目管理] 呈现树的构建 13 个条目
  10. [Python程序设计] Django架构流程分析 7 个条目
  11. [JavaScript程序设计] 关于HTTP Keep-Alive 6 个条目
  12. [移动开发] Android Studio里的Gradle 3 个条目
窗口 -- [博客]