使用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); ide

  //從Android 2.3以後,系統增長了一個類:StrictMode。這個類對網絡的訪問方式進行了必定的改變。 工具

Android的官方文檔給出了這個類設置的目的: 開發工具

StrictMode是一個系統提供的開發工具,用以檢測在開發過程當中由於偶然的事故從而形成的系統潛在的問題,進而提示開發者對其進行修復。 ui

StrictMode一般用於捕獲磁盤訪問或者網絡訪問中與主進程之間交互產生的問題,由於在主進程中,UI操做和一些動做的執行是最常常用到的,它們之間會產生必定的衝突問題。將磁盤訪問和網絡訪問從主線程中剝離可使磁盤或者網絡的訪問更加流暢,提高響應度和用戶體驗。 url

顯然,大多數初學者在進行網絡開發時,會選擇將訪問網絡的代碼直接放到主進程中,因爲和主進程的首要工做——UI交互——相矛盾,所以,必須設置必定的檢測機制,以保證系統運行的流暢,全部的異常均可以被檢測。 spa

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

第二種方式:經過Hanlder 和Thread去實現 code

如今讓咱們看看它們都是作什麼的。
public static voidsetThreadPolicy(StrictMode.ThreadPolicy policy)
這個方法容許咱們爲當前應用設置一組線程運行策略機制。其中的參數是一個策略組(即一組策略)。
public static finalclass StrictMode.ThreadPolicy.Builder()
Builder是StrictMode中內嵌類ThreadPolicy的一個內嵌類,在此咱們調用了它的默認構造方法。
detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build()
經過這種方式,咱們設置了一組監控模式,咱們要檢測磁盤的讀寫,網絡的訪問, Log中的違規等。
第二條語句設置了虛擬機的一組監控策略,參數一致,所以再也不贅述。
這樣,在保證了網絡和磁盤訪問受控以後,主線程就容許咱們對網絡資源進行訪問。
最後,須要說的是,策略限制只須要在主線程運行開始階段,也就是onCreate剛被調用的時候使用添加,其後的全部方法都將遵循這一規則。 orm

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

相關文章
相關標籤/搜索