使用URL访问网络资源

@SuppressLint("NewApi")
public class MainActivity extends Activity {
 private final String LINK = "http://f.hiphotos.baidu.com/album/w%3D2048/sign=a06e8c9991ef76c6d0d2fc2ba92efcfa/b03533fa828ba61eed6096974034970a314e59ff.jpg";
 private ImageView show;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  show = (ImageView) findViewById(R.id.show);

  //从Android 2.3之后,系统增加了一个类:StrictMode。这个类对网络的访问方式进行了一定的改变。

Android的官方文档给出了这个类设置的目的:

StrictMode是一个系统提供的开发工具,用以检测在开发过程中因为偶然的事故从而造成的系统潜在的问题,进而提示开发者对其进行修复。

StrictMode通常用于捕获磁盘访问或者网络访问中与主进程之间交互产生的问题,因为在主进程中,UI操作和一些动作的执行是最经常用到的,它们之间会产生一定的冲突问题。将磁盘访问和网络访问从主线程中剥离可以使磁盘或者网络的访问更加流畅,提升响应度和用户体验。

显然,大多数初学者在进行网络开发时,会选择将访问网络的代码直接放到主进程中,由于和主进程的首要工作——UI交互——相矛盾,因此,必须设置一定的检测机制,以保证系统运行的流畅,所有的异常都可以被检测。

第一种方式:
  StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
  StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());

第二种方式:通过Hanlder 和Thread去实现

现在让我们看看它们都是做什么的。
public static voidsetThreadPolicy(StrictMode.ThreadPolicy policy)
这个方法允许我们为当前应用设置一组线程运行策略机制。其中的参数是一个策略组(即一组策略)。
public static finalclass StrictMode.ThreadPolicy.Builder()
Builder是StrictMode中内嵌类ThreadPolicy的一个内嵌类,在此我们调用了它的默认构造方法。
detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build()
通过这种方式,我们设置了一组监控模式,我们要检测磁盘的读写,网络的访问, Log中的违规等。
第二条语句设置了虚拟机的一组监控策略,参数一致,因此不再赘述。
这样,在保证了网络和磁盘访问受控之后,主线程就允许我们对网络资源进行访问。
最后,需要说的是,策略限制只需要在主线程运行开始阶段,也就是onCreate刚被调用的时候使用添加,其后的所有方法都将遵循这一规则。

  try {
   URL url = new URL(LINK);
   // 打开该URL对应的资源的输入流
   InputStream is = url.openStream();
   Bitmap bitmap = BitmapFactory.decodeStream(is);
   show.setImageBitmap(bitmap);
   is.close();
   // 再次打开URL对应的资源输入流
   is = url.openStream();
   // 打开手机文件对应的输出流
   OutputStream os = openFileOutput("ym.png", MODE_WORLD_READABLE);
   byte[] buff = new byte[1024];
   int hasRead = 0;
   // 将URL对应的资源下载到本地
   while ((hasRead = is.read(buff)) > 0) {
    os.write(buff, 0, hasRead);
   }
   is.close();
   os.close();
  } catch (MalformedURLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

你可能感兴趣的:(使用URL访问网络资源)