編輯:關於Android編程
今天在網上看到了一個關於讀取網絡文件的小視頻,覺得不錯,拿來與大家分享
思路
具體的思路比較的簡單,但是思想非常的單純。那就是輸入一個網址,點擊按鈕,將從網絡上獲取的一張圖片顯示到一個ImageView控件上。
這樣看來,我們需要用到的核心就是網絡操作了。說白了,就是讀取網絡流文件了。
代碼展示
首先是主界面的布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <EditText android:id="@+id/et_website" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="please type the url " /> <Button android:id="@+id/btn_get" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Check" /> <ImageView android:id="@+id/iv_picture" android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> </LinearLayout>
然後是主界面的邏輯代碼
package com.example.getphotobyxml; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.Toast; import com.example.service.ImageService; public class MainActivity extends Activity { private EditText mEt_url; private ImageView mIv_picture; private Button mBtn_get; /** * 初始化相關的需要使用到的ID */ public void init() { mEt_url = (EditText) findViewById(R.id.et_website); mIv_picture = (ImageView) findViewById(R.id.iv_picture); mBtn_get = (Button) findViewById(R.id.btn_get); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //記得要調用哦 init(); mBtn_get.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String website = mEt_url.getText().toString(); if (website == null || website.equals("")) { Toast.makeText(MainActivity.this, "請輸入正確的網址哦!", Toast.LENGTH_LONG).show(); return; } byte[] bytes; try { bytes = ImageService.getImage(website); Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); mIv_picture.setImageBitmap(bitmap); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } /** * 從網絡以XML的方式獲得一張圖片,並顯示到一個ImageView上 * 按鈕事件可以直接不注冊onClickListener,而使用這個方法 * @param view */ public void getPicture(View view) { String website = mEt_url.getText().toString(); if (website == null || website.equals("")) { Toast.makeText(this, "請輸入正確的網址哦!", Toast.LENGTH_LONG).show(); return; } byte[] bytes; try { bytes = ImageService.getImage(website); Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); mIv_picture.setImageBitmap(bitmap); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
service 以及 tools助手
package com.example.service; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import com.example.utils.StreamTool; /** *圖片服務的業務類 */ public class ImageService { public static byte[] getImage(String website) throws Exception { URL url = new URL(website); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); if(conn.getResponseCode()==200){ InputStream inputStream = conn.getInputStream(); byte[] bytes = StreamTool.read(inputStream); return bytes; } return "讀取網絡數據失敗".getBytes(); } }
package com.example.utils; import java.io.ByteArrayOutputStream; import java.io.InputStream; /** *專門用於將輸入流轉換成一個字節數組的utils類 */ public class StreamTool { public static byte[] read(InputStream inputStream) throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buf = new byte[1024]; int len = 0; while((len = inputStream.read(buf))!=-1){ baos.write(buf, 0 ,len); } baos.close(); return buf; } }
總結
這裡面的代碼是非常的簡單的,我這裡貼出代碼的主要的目的是為了展示分層的思想,以及重構的藝術。
在代碼中我們看到了,創建了專門的類來完成專門的工作。而且不同的層次的類,處理的業務也是不一樣的。這樣有助於我們以面向對象的方式編程,帶來更加清晰的邏輯。