HTTP基礎與Android之——使用HttpClient和HttpURLConnection
1、客戶端連線伺服器實現內部的原理:
分析上圖,步驟如下:
第一步:在瀏覽器客戶端中得到使用者輸入的內容。
第二步:瀏覽器得到這個網址之後,內部會將這個域名傳送到DNS上,進行域名解析。得到它的IP之後就會連結到指定的伺服器上,假如伺服器的地址是:221.104.13.32:80,從瀏覽器到伺服器埠它使用到最底層的TCP/IP協議。
第三步:實現TCP/IP協議用Socket來完成,使用了Socket的套接字。
第四步:伺服器端的80埠監聽客戶端的連結,這樣客戶端到伺服器就連結上了。
伺服器接收到這些內容之後,並按照這些請求的路徑找到對應的頁面,進一步找到對應的網頁內容,返回給客戶端。
通俗一點講,使用者在瀏覽器輸入網址,通過http協議發出去,網址經過DNS域名解析,解析成指定的ip地址,並在80埠上監聽使用者的請求。伺服器監聽到請求之後,會以三種方式返回給客戶端:HTML、XML、JASON。
GET方式和POST方式的差別:
GET是從伺服器上獲取資料,POST是向伺服器傳送資料。
在客戶端,GET方式在通過URL提交資料,資料在URL中可以看到;POST方式,資料放在HTML HEADER內提交。
對於GET方式,伺服器端用Request.QueryString獲取變數的值,對於POST方式,伺服器用Request.Form獲取提交的資料。
GET方式提交的資料不能大於2KB(主要是URL長度限制),而POST則沒有此限制。
安全性問題。正如2中提到,使用GET的時候,引數會顯示在位址列上,而POST不會。所以,如果這些資料是中文資料而且是非敏感資料,那麼使用GET;如果使用者輸入的資料不是中文字元而且包含敏感資料,那麼還是使用POST為好。
HTTP返回請求資料的三種方式:
1、以HTML程式碼內容返回。
2、以XML字串的形式返回,在以後的android開發中這種形式返回資料比較多。
3、以JSON物件形式返回,在網路流量上考慮JSON要比XML方式要好一些,便於解析。
在Android當中,一般使用xml和Json資料解析。
2、使用HTTP協議訪問網路:
Android中的WebView控制元件已經在後臺幫我們處理好了傳送HTTP請求、接收服務響應、解析返回資料,以及最終的頁面展示這幾步工作,不過由於它封裝得太好了,反而不能直觀地看出HTTP協議是如何工作的。因此接下來我們通過手動傳送HTTP請求的方式,來更加深入的瞭解這一過程。
在Android上傳送HTTP請求的方式一般有兩種:HttpURLConnection和HttpCient。我們先來學習HttpCient。
3、HttpCient:
HttpClient是Apache開源組織提供的HTTP網路訪問介面(一個開源的專案),從名字上就可以看出,它是一個簡單的HTTP客戶端(並不是瀏覽器),可以傳送HTTP請求,接受HTTP響應。但是不會快取伺服器的響應,不能執行HTTP頁面中籤入嵌入的JS程式碼,自然也不會對頁面內容進行任何解析、處理,這些都是需要開發人員來完成的。
現在Android已經成功集成了HttpClient,所以開發人員在Android專案中可以直接使用HttpClient來想Web站點提交請求以及接受響應,如果使用其他的Java專案,需要引入進相應的Jar包。HttpClient可以在官網上下載。官網連結:http://hc.apache.org/downloads.cgi
HttpClient其實是一個interface型別,HttpClient封裝了物件需要執行的Http請求、身份驗證、連線管理和其它特性。既然HttpClient是一個介面,因此無法建立它的例項。從文件上看,HttpClient有三個已知的實現類分別是:AbstractHttpClient, AndroidHttpClient, DefaultHttpClient,會發現有一個專門為Android應用準備的實現類AndroidHttpClient,當然使用常規的DefaultHttpClient也可以實現功能。
從兩個類包所有在位置就可以看出區別,AndroidHttpClient定義在android.net.http.AndroidHttpClient包下,屬於Android原生的http訪問,而DefaultHttpClient定義在org.apache.http.impl.client.DefaultHttpClient包下,屬於對apche專案的支援。而AndroidHttpClient沒有公開的建構函式,只能通過靜態方法newInstance()方法來獲得AndroidHttpClient物件。
簡單來說,用HttpClient傳送請求、接收響應都很簡單,只需要五大步驟即可:(要牢記)
1、建立代表客戶端的HttpClient物件。
2、建立代表請求的物件,如果需要傳送GET請求,則建立HttpGet物件,如果需要傳送POST請求,則建立HttpPost物件。注:對於傳送請求的引數,GET和POST使用的方式不同,GET方式可以使用拼接字串的方式,把引數拼接在URL結尾;POST方式需要使用setEntity(HttpEntity entity)方法來設定請求引數。
3、呼叫HttpClient物件的execute(HttpUriRequest request)傳送請求,執行該方法後,將獲得伺服器返回的HttpResponse物件。伺服器發還給我們的資料就在這個HttpResponse相應當中。呼叫HttpResponse的對應方法獲取伺服器的響應頭、響應內容等。
4、檢查相應狀態是否正常。伺服器發給客戶端的相應,有一個相應碼:相應碼為200,正常;相應碼為404,客戶端錯誤;相應碼為505,伺服器端錯誤。
5、獲得相應物件當中的資料
4、DefaultHttpClient:
GET方式
佈局檔案,activity_main.xml
<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"
tools:context=".MainActivity" >
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Send Request" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/TextView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</ScrollView>
</LinearLayout>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
佈局檔案中,我們用一個ScrollView來包裹TextView。藉助ScrollView控制元件的話,就可以允許我們一滾動的形式檢視螢幕外i的那部分內容。
MainActivity.java的程式碼如下:
package com.example.m04_http01;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
public static final int SHOW_RESPONSE = 0;
private Button button_sendRequest;
private TextView textView_response;
//新建Handler的物件,在這裡接收Message,然後更新TextView控制元件的內容
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case SHOW_RESPONSE:
String response = (String) msg.obj;
textView_response.setText(response);
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView_response = (TextView)findViewById(R.id.TextView1);
button_sendRequest = (Button)findViewById(R.id.button1);
button_sendRequest.setOnClickListener(new OnClickListener() {
//點選按鈕時,執行sendRequestWithHttpClient()方法裡面的執行緒
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
sendRequestWithHttpClient();
}
});
}
//方法:傳送網路請求,獲取百度首頁的資料。在裡面開啟執行緒
private void sendRequestWithHttpClient() {
new Thread(new Runnable() {
@Override
public void run() {
//用HttpClient傳送請求,分為五步
//第一步:建立HttpClient物件
HttpClient httpCient = new DefaultHttpClient();
//第二步:建立代表請求的物件,引數是訪問的伺服器地址
HttpGet httpGet = new HttpGet("http://www.baidu.com");
try {
//第三步:執行請求,獲取伺服器發還的相應物件
HttpResponse httpResponse = httpCient.execute(httpGet);
//第四步:檢查相應的狀態是否正常:檢查狀態碼的值是200表示正常
if (httpResponse.getStatusLine().getStatusCode() == 200) {
//第五步:從相應物件當中取出資料,放到entity當中
HttpEntity entity = httpResponse.getEntity();
String response = EntityUtils.toString(entity,"utf-8");//將entity當中的資料轉換為字串
//在子執行緒中將Message物件發出去
Message message = new Message();
message.what = SHOW_RESPONSE;
message.obj = response.toString();
handler.sendMessage(message);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();//這個start()方法不要忘記了
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
最後要記得在清單檔案中宣告訪問網路的許可權:
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16" />
<uses-permission android:name="android.permission.INTERNET"/>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
POST方式
POST提交資料的步驟:
- 構造請求物件;
- 將需要傳遞給伺服器端的資料放置在鍵值對物件當中;
- 將準備好的鍵值對放置在List當中;
- 生成代表請求體的物件;
- 將存有請求鍵值對的List物件放置在請求題物件當中;
- 將請求體物件放置到請求物件當中;
- 傳送請求物件
後面的步驟(即處理請求物件)和GET方法是一致的。
package com.example.m04_http02;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
private EditText nameText;
private EditText pwdText;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
nameText = (EditText) findViewById(R.id.nameText);
pwdText = (EditText) findViewById(R.id.pwdText);
button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// 使用者輸入使用者名稱密碼, 然後通過Get方法傳送給本地伺服器
String name = nameText.getText().toString();
String pwd = pwdText.getText().toString();
// 使用GET方法向本地伺服器傳送資料
//GetThread getThread = new GetThread(name, pwd);
//getThread.start();
//使用POST方法向伺服器傳送資料
PostThread postThread = new PostThread(name, pwd);
postThread.start();
}
});
}
//子執行緒:通過GET方法向伺服器傳送使用者名稱、密碼的資訊
class GetThread extends Thread {
String name;
String pwd;
public GetThread(String name, String pwd) {
this.name = name;
this.pwd = pwd;
}
@Override
public void run() {
//用HttpClient傳送請求,分為五步
//第一步:建立HttpClient物件
HttpClient httpClient = new DefaultHttpClient();
//注意,下面這一行中,我之前把連結中的"test"誤寫成了"text",導致調BUG調了半天沒弄出來,真是浪費時間啊
String url = "http://192.168.1.112:8080/test.jsp?name=" + name+ "&password=" + pwd;
//第二步:建立代表請求的物件,引數是訪問的伺服器地址
HttpGet httpGet = new HttpGet(url);
try {
//第三步:執行請求,獲取伺服器發還的相應物件
HttpResponse response = httpClient.execute(httpGet);
//第四步:檢查相應的狀態是否正常:檢查狀態碼的值是200表示正常
if (response.getStatusLine().getStatusCode() == 200) {
//第五步:從相應物件當中取出資料,放到entity當中
HttpEntity entity = response.getEntity();
BufferedReader reader = new BufferedReader(
new InputStreamReader(entity.getContent()));
String result = reader.readLine();
Log.d("HTTP", "GET:" + result);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
//子執行緒:使用POST方法向伺服器傳送使用者名稱、密碼等資料
class PostThread extends Thread {
String name;
String pwd;
public PostThread(String name, String pwd) {
this.name = name;
this.pwd = pwd;
}
@Override
public void run() {
HttpClient httpClient = new DefaultHttpClient();
String url = "http://192.168.1.112:8080/test.jsp";
//第二步:生成使用POST方法的請求物件
HttpPost httpPost = new HttpPost(url);
//NameValuePair物件代表了一個需要發往伺服器的鍵值對
NameValuePair pair1 = new BasicNameValuePair("name", name);
NameValuePair pair2 = new BasicNameValuePair("password", pwd);
//將準備好的鍵值對物件放置在一個List當中
ArrayList<NameValuePair> pairs = new ArrayList<NameValuePair>();
pairs.add(pair1);
pairs.add(pair2);
try {
//建立代表請求體的物件(注意,是請求體)
HttpEntity requestEntity = new UrlEncodedFormEntity(pairs);
//將請求體放置在請求物件當中
httpPost.setEntity(requestEntity);
//執行請求物件
try {
//第三步:執行請求物件,獲取伺服器發還的相應物件
HttpResponse response = httpClient.execute(httpPost);
//第四步:檢查相應的狀態是否正常:檢查狀態碼的值是200表示正常
if (response.getStatusLine().getStatusCode() == 200) {
//第五步:從相應物件當中取出資料,放到entity當中
HttpEntity entity = response.getEntity();
BufferedReader reader = new BufferedReader(
new InputStreamReader(entity.getContent()));
String result = reader.readLine();
Log.d("HTTP", "POST:" + result);
}
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
5、Java中使用HTTP——HttpURLConnection
HttpURLConnection繼承了URLConnection,所以在URLConnection的基礎上進一步改進,增加了一些用於操作HTTP資源的便捷方法。Java中HttpURLConnection物件通過URL.openConnection()方法來獲得,需要進行強制轉換。先來介紹幾個HttpURLConnection的常用方法:
-
void setConnectTimeout(int timeout):設定連線超時時長,如果超過timeout時長,則放棄連線,單位以毫秒計算。
-
void setDoInput(boolean newValue) :標誌是否允許輸入。
-
void setDoOutput(boolean newValue):標誌是否允許輸出。
-
String getRequestMethod():獲取傳送請求的方法。
-
int getResponseCode():獲取伺服器的響應碼。
-
void setRequestMethod(String method):設定傳送請求的方法。
-
void setRequestProperty(String field,String newValue):設定請求報文頭,並且只對當前HttpURLConnection有效。
GET方式
這個例子通過GET方式從服務端獲取一張圖片的資訊,並把其儲存在本地磁碟中。伺服器為本機上的IIS,一張靜態圖片,直接通過URL訪問。
package com.http.get;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class HttpUtils {
private static String URL_PATH = "http://192.168.1.106:8080/green.jpg";
/**
* @param args
*/
public static void main(String[] args) {
// 呼叫方法獲取圖片並儲存
saveImageToDisk();
}
/**
* 通過URL_PATH的地址訪問圖片並儲存到本地
*/
public static void saveImageToDisk()
{
InputStream inputStream= getInputStream();
byte[] data=new byte[1024];
int len=0;
FileOutputStream fileOutputStream=null;
try {
//把圖片檔案儲存在本地F盤下
fileOutputStream=new FileOutputStream("F:\\test.png");
while((len=inputStream.read(data))!=-1)
{
//向本地檔案中寫入圖片流
fileOutputStream.write(data,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}
finally
{
//最後關閉流
if(inputStream!=null)
{
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fileOutputStream!=null)
{
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 通過URL獲取圖片
* @return URL地址圖片的輸入流。
*/
public static InputStream getInputStream() {
InputStream inputStream = null;
HttpURLConnection httpURLConnection = null;
try {
//根據URL地址例項化一個URL物件,用於建立HttpURLConnection物件。
URL url = new URL(URL_PATH);
if (url != null) {
//openConnection獲得當前URL的連線
httpURLConnection = (HttpURLConnection) url.openConnection();
//設定3秒的響應超時
httpURLConnection.setConnectTimeout(3000);
//設定允許輸入
httpURLConnection.setDoInput(true);
//設定為GET方式請求資料
httpURLConnection.setRequestMethod("GET");
//獲取連線響應碼,200為成功,如果為其他,均表示有問題
int responseCode=httpURLConnection.getResponseCode();
if(responseCode==200)
{
//getInputStream獲取服務端返回的資料流。
inputStream=httpURLConnection.getInputStream();
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return inputStream;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
-
相關推薦
HTTP基礎與Android之——使用HttpClient和HttpURLConnection
1、客戶端連線伺服器實現內部的原理: 分析上圖,步驟如下: 第一步:在瀏覽器客戶端中得到使用者輸入的內容。 第二步:瀏覽器得到這個網址之後,內部會將這個域名傳送到DNS上,進行域名解析。得到它的IP之後就會連結到指定的伺服器上,假如伺服器的地址是:221.104.13.32:80,從瀏覽器
Android之HttpClient 和HttpResponse 小結
三步曲: 1.建立HttpGet或者HttpPost物件,將要請求的URL物件構造方法傳入HttpGet、HttpPost物件 2.通過HttpClent介面的實現類DefaultClent.的excute(HttpUriRequest request)而我們已經知道
HTTP基礎與Android——HTTP請求頭響應頭
一、HTTP頭資訊解讀: HTTP的頭域包括通用頭、請求頭、響應頭和實體頭四個部分。每個頭域由一個域名,冒號(:)和域值三部分組成(說白了就是鍵值對)。 通用頭:是客戶端和伺服器都可以使用的頭部,可以在客戶端、伺服器和其他應用程式之間提供一些非
網站優化的藝術與科學之工具和基礎知識
最近在閱讀一本網站優化的書,名叫《深入理解網站優化:提升網站轉化率的藝術與科學》,本書是對網站優化的4個學科(Web分析、網站易用性、線上營銷和網站測試)的最佳實踐。網站優化是一門新穎的藝術,結合前面這四門學科完成對網站的測試和分析,更好地吸引和轉化訪問者。 實施本書中的最佳實踐和測試思路,就能以
Redis 設計與實現之RDB 和 AOF 兩種持久化模式詳解
在執行情況下, Redis 以資料結構的形式將資料維持在記憶體中, 為了讓這些資料在 Redis 重啟之後仍然可用, Redis 分別提供了 RDB 和 AOF 兩種持久化模式。 在 Redis 執行時, RDB 程式將當前記憶體中的資料庫快照儲存到磁碟檔案中, 在 Red
HttpClient和HttpURLConnection的使用和區別
https://www.cnblogs.com/liushuibufu/p/4140913.html 功能用法對比 從功能上對比,HttpURLConnection比HttpClient庫要豐富很多,提供了很多工具,封裝了http的請求頭,引數,內容體,響應,還有一
HttpClient和HttpURLConnection的區別和案例
HttpURLConnection 物件 1. HttpURLConnection物件需要通過URL類中的openConnection()方法來獲得,它無法直接構造。 HttpsURLConnection urlconn = null; URL url = new UR
資料結構與演算法之 佇列和廣度優先搜尋(BFS)
佇列和 BFS 廣度優先搜尋(BFS)的一個常見應用是找出從根結點到目標結點的最短路徑。在本文中,我們提供了一個示例來解釋在 BFS 演算法中是如何逐步應用佇列的。 洞悉 1. 結點的處理順序是什麼? 在第一輪中,我們處理根結點。在第二輪中,我們處理根結點旁
進階光照與材質之光照和反射模型
第五章講述了一些漫反射模型和鏡面反射模型的原理和數學公式 博主在unity中實現了一下,把部分結果貼在上面 有下面幾個主題: 渲染公式 基本光照定義 光照和lambert法則 雙向反射分佈函式BRDF 漫反射材質原理簡介與模型 鏡面反射材質原理簡介與模型 基本光照定義 對於
Android之drawable和mipmap目錄區別
在android studio中我們建立專案後,在資源res檔案中有drawable和mipmap兩種存放圖片的資料夾,在使用哪一個資料夾來存放圖片,一直都很有爭議: android 在 API level 17 加入了 mipmap 技術,對 bitmap 圖片的渲染支援 mipmap 技術,
HTTP伺服器與android客戶端的json互動
廢話就不多說了,直接上程式碼: 伺服器端: ①MySQL中建立一個數據庫hello,建一張表tab_user,新增欄位id,username,password。然後隨便新增幾條記錄。 ②新建Java Web工程HelloServer。 ③在WEB-INF目錄下的lib
android之layout_toLeftOf和layout_toRightOf出現的錯誤
錯誤是這樣的,佈局檔案如下,總是在SeekBar裡面的這一句android:layout_toLeftOf="@id/voice_max"報錯,差點氣得我吐血,明明沒有錯誤的. <ImageView android:id="@+id/voice_
HttpClient和HttpURLConnection整合彙總對比
總結了網上的一些資源,主要有以下兩個觀點: 分析一: 在研究Volley框架的原始碼中,發現它在HTTP請求的使用上比較有意思,在Android 2.3及以上版本,使用的是HttpURLConnection,而在Android 2.2及以下版本,使用的是HttpClient。我也比較
android中URLConnection和HttpURLConnection
HttpURLConnection 適用於HTTP(RFC 2616)的URLConnection,用於在網路上傳送和接受資料。這個類可以用來發送或者接受那些事先不知道長度的流式資料。 可以採用如下方式使用這個類: 1.通過呼叫URL.openConnection()方法,再執行強制型別轉換獲取Htt
Android之ToolBar和自定義ToolBar實現沉浸式狀態列
沉浸式狀態列確切的說應該叫做透明狀態列。一般情況下,狀態列的底色都為黑色,而沉浸式狀態列則是把狀態列設定為透明或者半透明。 沉浸式狀態列是從android Kitkat(Android 4.4)開始出
HttpClient 和 HttpURLConnection 共用session
最近又開始折騰android專案了,專案中需要請求伺服器段的介面,又要涉及到圖片的資源,比較糾結的是,我開始著手這個專案的時候,網路請求的框架已經完成了,現在存在一個問題就是,請求介面的使用的是HttpClient,這個是已經封裝好了,不方便修改的,但是圖片下載,如果這套
Android之Observer和Observable
package java.util; public class Observable { private boolean changed = false; private final ArrayList<Observer> observers; public Observable(
Android之abstract和interface介紹
abstract , interface // 抽象類abstractclassAbc{// 抽象類中的抽象方法publicabstractvoid setData(int i);publicvoidPrint(){// 呼叫了抽象方法 setData(1
一起學Android之ToggleButton和Switch
本文以一個簡單的小例子,簡述在Android開發中ToggleButton(開關按鈕)和Switch(開關)的簡單使用,僅供學習分享使用。 概述 ToggleButton是一個有兩種狀態(checked/unchecked)的按鈕,經常用於開/關等場景中,預設文字顯示(ON/OFF),Switch 是一個
Android之vertical和horizontal的區別
當 android:orientation=”vertical” 時, 只有水平方向的設定才起作用,垂直方向的設定不起作用。即:left,right,center_horizontal 是生效的。當 android:orientation=”horizontal” 時, 只