一、网络操作
在网络操作中JAVA已经为我提供了一套API用来进行网络操作,在android开发中我们仍可以这套API来做开发。下面通过一个简单的例子来了解一下android下的网络操作。
点击图中下载按钮从服务器上下载一张图片下来
二、xml布局文件
布局文件采用线性布局,只使用到一个button和一个image
三、MainActivity.java
在代码中当点击事件发生后,就通过通过URL来创建一个HttpURLConnection对象来向服务器建立连接,发起HTTP请求。当请求成功后,表明数据已经在内存中。这时,我们应该从内存中拿到数据并将其封装成一个bitmap对象,这个对象是android提供的,专门用来将从互联网上download的图片直接显示。这些操作我们都放在子线程中,一个原因是google要求必须这样,另一方面如果把耗时操作放在主线程(也就是UI线程)中,会引起主线程阻塞,这样显示界面会卡死。
package xidian.dy.com.chujia;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.Toast;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;public class MainActivity extends AppCompatActivity { private static ImageView img; static MainActivity ma; static Handler handler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn = (Button) findViewById(R.id.btn); ma = this; handler = new Handler(){ @Override //此方法在主线程中刷新UI public void handleMessage(Message msg) { if(img != null){ if(msg.what == 0) img.setImageBitmap((Bitmap)msg.obj); else Toast.makeText(ma,"图片下载失败",Toast.LENGTH_SHORT).show(); } } }; if(btn != null) btn.setOnClickListener(new MyLister()); } class MyLister implements View.OnClickListener{ @Override public void onClick(View v) { img = (ImageView) findViewById(R.id.img); new Thread(){ @Override public void run() { try { URL url = new URL("http://192.168.0.119/dog.jpg"); //创建连接对象 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //设置请求方式 conn.setRequestMethod("GET"); //设置TCP连接超时 conn.setConnectTimeout(5000); //设置http响应超时 conn.setReadTimeout(5000); //建立连接 conn.connect(); Message msg = handler.obtainMessage(); if(conn.getResponseCode() == 200){ InputStream is = conn.getInputStream(); Bitmap bm = BitmapFactory.decodeStream(is); msg.what = 0; msg.obj = bm; handler.sendMessage(msg); } else { msg.what = 1; handler.sendMessage(msg); } Toast.makeText(MainActivity.this, "下载失败", Toast.LENGTH_SHORT).show(); } catch (Exception e) { e.printStackTrace(); } } }.start(); } }}
在MainAactivity中创建一个handler对象是用于可子线程进行数据交互的。主线程在创建的时候,系统会同时创建消息队列对象(MessageQueue)和消息轮询器对象(Looper)线程,轮询器的作用就是不停的检查消息队列中是否有消息,消息队列一旦有消息,轮询器会把消息对象传递给Handler,并调用handler的dispatcherMessage方法。
public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); } }
在dispachMessage中会调用我们的handleMessage方法。、
修改配置文件
在配置文件中我们要赋予app访问网络的权限