編輯:關於Android編程
一個UrlConnection常用來通過網絡發送和獲取數據,數據可以使任何類型任何長度,HttpUrlConnection通常用於發送和接收長度未知的流數據;
創建HttpURLConnection:通過調用Url.openConnection()並將其類型轉換為HttpUrlConnection 創建Request:要包含最基本的Url,你可以設置請求頭部(請求數據類型,長度等) 設置請求主體(body):這不是必須的,如果需要設置,確保setOutput(true); 讀取Response:返回響應,頭部包含數據類型,長度等數據,可以通過getInputStream()讀取響應數據的主體(body),如果沒有Response沒有body,則返回一個Empty Stream 斷開連接:調用HttpUrlConnection的disconnect()方法使用HttpUrlConnection的一個簡單示例:從遠程獲取圖片並顯示在ImageView中
ImageView imageView=(ImageView).findViewById(R.id.imageview);
URL url=new URL(http://www.jycoder.com/json/movies/1.jpg);
HttpUrlConnection conn= (HttpUrlConnection) url.openConnection();
conn.connect();
try{
InputStream in=conn.getInputStream();
//將獲取到的圖片顯示在ImageView中
Bitmap bitmap=BitmapFactory.decodeStream(in);
imageView.setImageBitmap(BitmapFactory.decode(is));
}
finally{
conn.disconnect();
}
上面就是HttpUrlConnection的基本用法,還有些需要掌握的主題:
Http Response錯誤:有時候響應錯誤或者異常,直接getInputStream()就會拋出異常,我們可以通過getErrorStream();讀取Response錯誤信息,getHeaderFields()讀取響應頭部; Post Content:發送數據到服務器,首先需要setOutput(true);為了性能,如果你知道你所Post內容的大小,你可以使用setFixedLengthStreamingMode(int),如果不知道,可以使用setChunkedStreamingMode(int); HTTP Method:可以通過setRequestMethod(String)設置 Cookie和Cache:HttpUrlConnection擁有CookieManager和CookieHandler方法來設置Cookie,對於Cache提供了HttpResponseCache類;關於這部分參考資料:HttpUrlConnectionAndroid 官方在API 22之後已經棄用,盡量使用HttpUrlConnection
AsyncTask是實現異步操作的一種機制,我們常常需要更新UI,但主線程不能執行耗時操作,否則會引發錯誤;AsyncTask用於執行後台操作,無需手動處理線程的創建和執行;它常用來處理一些短時操作,如果長時間操作考慮使用Service
AsyncTask的使用:
創建一個Task:我們需要創建一個Task繼承自AsyncTask,
AsyncTask中需要三個參數Params,Progress,Result:在主線程中執行Task:必須在主線程中實例化和執行AsyncTask,而且每個AsyncTask只執行一次 取消一個Task:AsyncTask可以在任何時候通過調用cancel(true)取消。Tips:可以看到AsyncTask中的四個方法只有doInBackground()實在後台線程中運行的,因此在它裡面執行一些耗時操作,而其它方法運行在UI線程,執行更新UI視圖等操作。
綜合以上我們來做個練習:
新建項目:UseAsyncTask
在Manifest.xml
中添加聯網權限
創建布局,我們這裡用來顯示一張電影圖片,
完成MainActivity
public class MainActivity extends ActionBarActivity {
private ImageView imageView;
//圖片地址
private final String url=http://www.jycoder.com/json/movies/2.jpg;
//顯示進度
private ProgressDialog pDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//用來顯示進度
pDialog=new ProgressDialog(this);
pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pDialog.setMessage(Loading...);
pDialog.setMax(100);
imageView= (ImageView) findViewById(R.id.movie_image);
//執行Task
new ImageDownloadTask().execute(url);
}
public class ImageDownloadTask extends AsyncTask{
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog.show();
}
@Override
protected Bitmap doInBackground(String... urls) {
HttpURLConnection connection = null;
Bitmap bitmap=null;
try {
URL url=new URL(urls[0]);
connection= (HttpURLConnection) url.openConnection();
InputStream in= new BufferedInputStream(connection.getInputStream());
bitmap= BitmapFactory.decodeStream(in);
//獲取文件流大小,用於更新進度
int length=connection.getContentLength();
int len=0,total_length=0,value=0;
byte[] data=new byte[1024];
while((len = in.read(data)) != -1){
total_length += len;
value = (int)((total_length/(float)length)*100);
//調用update函數,更新進度
publishProgress(value);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if (connection!=null)
connection.disconnect();
}
return bitmap;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
pDialog.setProgress(values[0]);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if(pDialog!=null)
pDialog.dismiss();
pDialog = null;
//將Bitmap填充進Imageview
imageView.setImageBitmap(bitmap);
}
}
}
這部分內容很簡單吧~,其實這部分難的就是我們需要理解UI線程,以及了解AsyncTask與Service的適用場景。
1.場景還原之FliddlerFiddler是一款抓包神器,近日,由於項目中要嵌入H5頁面,公司又沒專門的UI設計師,所以你懂得,這個任務就要給我喽!可憐的我並沒有藝術細
Android插件開發初探 對於Android的插件化其實已經討論已久了,但是市面上還沒有非常靠譜成熟的插件框架供我們使用。這裡我們就嘗試性的對比一下Java中,我們使用
聯系人提供程序是一個強大而又靈活的 Android 組件,用於管理設備上有關聯系人數據的中央存儲庫。 聯系人提供程序是您在設備的聯系人應用中看到的數據源,您也可以在自己的
ViewAnimator可以實現帶動畫效果的View切換,其派生的子類是一些帶動畫效果切換功能的組件。ViewAnimator支持的XML屬性: Attribute