Android-GETリクエスト、POSTリクエスト、データコミット、エンコード、HttpClient、async-httpオープンソースフレームワーク、マルチスレッドダウンロード、ブレークポイント継続、xUtilsフレームワーク
14375 ワード
転載は出典を明記してください.https://blog.csdn.net/mythmayor/article/details/72869238
1.GET方式提出データ
2.GETリクエストとPOSTリクエストの違い
メリットとデメリット*GETリクエストのメリット:urlの後にデータをグループ化するだけで非常に便利です.欠点:urlの後ろにデータをグループ化して、安全ではありません.データ長の制限があります.*POST要求の利点:安全で、データはurlの後ろでグループ化するのではなく、ストリームを通じてサーバに書く.データ長が制限されないという欠点:作成が面倒です.
データ提出*GET要求1.urlの後に提出するデータ*POST要求をグループ化する必要がある.データをグループ化する必要はありません.要求されたデータ型をurl符号化されたフォームデータとして指定する必要があります.Content-Type 3. サーバにストリームでデータを書き込むため、コミットデータの長さを指定する必要があります.Content-Length
3.POST方式提出データ
4.Tomcatデフォルトコードテーブル Tomcatデフォルトコードテーブルiso-8559-1 Tomcat文字列が認識されていない場合、デフォルトではローカルコードテーブル が使用されます.
5.GB 2312とGBK
GB 2312は1980年に発表され、標準は6763個の漢字を収録し、そのうち1級漢字は3755個、2級漢字は3008個である.また、GB 2312には、アルファベット、ギリシャ文字、日本語ひらがなおよびカタカナ文字、ロシア語シリル文字を含む682文字の全角文字が収録されている.GB 2312の出現は、漢字のコンピュータ処理のニーズを基本的に満たし、収録された漢字は中国大陸の99.75%の使用頻度をカバーしている.人名や古代中国語などで使われた珍しい字に対してはGB 2312が処理できず、後にGBKやGB 18030の漢字文字セットが登場した.GBKは1995年に発表され、GB 2312-80規格に基づいたイントラコード拡張規格で、21003文字の漢字を収録し、GB 2312-80規格と完全に互換性がある.
6.string.getBytes(String charsetName)とnew String(byte[]bytes,String charsetName) byte[] bytes = string.getBytes(String charsetName)は、文字列を指定された符号化でbyte配列に変換し、デフォルトではローカルコードテーブル を使用します. new String(byte[]bytes,String charsetName)byte配列を指定の符号化により文字列 に変換する
注意:文字化けしが発生した場合、ファイルを修正しないでください.修正後、どのように符号化を切り替えても間違っています.
7.提出データに中国語が含まれている注意事項
クライアント
サービス側
8.HttpClient
軽量ブラウザで、リクエストとレスポンスをオブジェクトにカプセル化ブラウザ を開く入力アドレス(データ) ノックアウト 9.HttpClientのGETとPOSTリクエスト
GETリクエスト
POSTリクエスト
10.async-httpオープンソースフレームワークのGET要求
11.async-httpオープンソースフレームワークのPOST要求
12.async-httpオープンソースフレームワークのファイルアップロードファイルアップロードの原理 ファイルアップロードは、POSTリクエスト です. Content-typeはmultipart/form-data 具体コード 13.マルチスレッドダウンロードマルチスレッド同時動作 ネットワーク要求 14.マルチスレッドがダウンロード速度を向上させる理由サーバから取得するリソースが多くなり、単位時間当たりのダウンロード速度が速くなる. のダウンロード速度は、サーバのアップロード帯域幅およびユーザのダウンロード帯域幅によっても制限される .
15.マルチスレッドダウンロードの手順クライアントのローカルに空白のファイルを作成します.ファイルのサイズはサーバと同じです.RandomAccessFile サーバのリソースをダウンロードするために複数のスレッドを開く すべてのスレッドがダウンロード完了すると、マルチスレッドダウンロードは を終了する.
16.サーバのリソースを異なるスレッドに分割する方法
17.マルチスレッドダウンロードファイル
18.ブレークポイント継続の原理
各スレッドのダウンロード進捗を記録し、次回のダウンロード時にその場所からダウンロードを開始します
19.マルチスレッドブレークポイントダウンロードの詳細ダウンロードタスクごとに自分の進捗を記録するファイル が必要です.ダウンロード完了後、記録ファイル を削除 synchronizeコードブロック の同期使用を保証する FileOutputStreamデータを使用するとストレージデバイスに毎回書き込まれるとは限らず、ハードディスクのキャッシュに書き込まれる可能性があり、RandomAccessFileを使用してモードをrwdに設定することで、毎回ディスクにデータが書き込まれることを保証できる .
20.xUtilsを使用してマルチスレッドブレークポイントのダウンロードを完了する
21.まとめサーバへのデータの送信 GETとPOST要求方式の違い 中国語の文字化けしの原因、解決方法 提出したデータには中国語の解決方法が含まれている HttpURLConnectionによるGETおよびPOSTコミット HttpClientを使用してGETとPOST提出 を行う.オープンソースフレームワークasync-httpを使用してGET、POSTコミット、アップロードファイル を行う.
マルチスレッドブレークポイントダウンロード マルチスレッドブレークポイントダウンロードの原理 マルチスレッドブレークポイントダウンロードのステップ サーバデータの一部を取得する方法 取得データをローカルファイルの一部 に書き込む方法マルチスレッドブレークポイントダウンロードの詳細 で完了したのはおもちゃコードのみで、実際のプロジェクトでは は使用できません.
オープンソースプロジェクトxUtilsを使用して、マルチスレッドブレークポイントダウンロード を実現
1.GET方式提出データ
new Thread(){
public void run() {
try {
//GET : url
String path = "http://192.168.1.103:8080/web/LoginServlet?qq="+qq+"&pwd="+pwd);
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
int code = conn.getResponseCode();
if(code == 200){
InputStream is = conn.getInputStream();
String result = StreamTools.readStream(is);
Message msg = Message.obtain();
msg.what = SUCCESS;
msg.obj = result;
handler.sendMessage(msg);
}else{
Message msg = Message.obtain();
msg.what = ERROR;
handler.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
Message msg = Message.obtain();
msg.what = ERROR;
handler.sendMessage(msg);
}
};
}.start();
2.GETリクエストとPOSTリクエストの違い
メリットとデメリット*GETリクエストのメリット:urlの後にデータをグループ化するだけで非常に便利です.欠点:urlの後ろにデータをグループ化して、安全ではありません.データ長の制限があります.*POST要求の利点:安全で、データはurlの後ろでグループ化するのではなく、ストリームを通じてサーバに書く.データ長が制限されないという欠点:作成が面倒です.
データ提出*GET要求1.urlの後に提出するデータ*POST要求をグループ化する必要がある.データをグループ化する必要はありません.要求されたデータ型をurl符号化されたフォームデータとして指定する必要があります.Content-Type 3. サーバにストリームでデータを書き込むため、コミットデータの長さを指定する必要があります.Content-Length
3.POST方式提出データ
new Thread(){
public void run() {
//
String path = "http://192.168.1.103:8080/web/LoginServlet";
try {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//1. POST
conn.setRequestMethod("POST"); // .
conn.setConnectTimeout(5000);
//2. http
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
//3.
//qq=10000&pwd=abcde
String data = "qq="+qq+"&pwd="+pwd;
conn.setRequestProperty("Content-Length", String.valueOf(data.length()));
//4.
conn.setDoOutput(true);
//5.
conn.getOutputStream().write(data.getBytes());
int code = conn.getResponseCode();
if(code == 200){
InputStream is = conn.getInputStream();
String result = StreamTools.readStream(is);
Message msg = Message.obtain();
msg.what = SUCCESS;
msg.obj = result;
handler.sendMessage(msg);
}else{
Message msg = Message.obtain();
msg.what = ERROR;
handler.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
Message msg = Message.obtain();
msg.what = ERROR;
handler.sendMessage(msg);
}
};
}.start();
4.Tomcatデフォルトコードテーブル
5.GB 2312とGBK
GB 2312は1980年に発表され、標準は6763個の漢字を収録し、そのうち1級漢字は3755個、2級漢字は3008個である.また、GB 2312には、アルファベット、ギリシャ文字、日本語ひらがなおよびカタカナ文字、ロシア語シリル文字を含む682文字の全角文字が収録されている.GB 2312の出現は、漢字のコンピュータ処理のニーズを基本的に満たし、収録された漢字は中国大陸の99.75%の使用頻度をカバーしている.人名や古代中国語などで使われた珍しい字に対してはGB 2312が処理できず、後にGBKやGB 18030の漢字文字セットが登場した.GBKは1995年に発表され、GB 2312-80規格に基づいたイントラコード拡張規格で、21003文字の漢字を収録し、GB 2312-80規格と完全に互換性がある.
6.string.getBytes(String charsetName)とnew String(byte[]bytes,String charsetName)
注意:文字化けしが発生した場合、ファイルを修正しないでください.修正後、どのように符号化を切り替えても間違っています.
7.提出データに中国語が含まれている注意事項
クライアント
// , qq UTF-8
URLEncoder.encode(qq, "UTF-8");
サービス側
String qq = request.getParameter("qq");//tomcat iso-8859-1
System.out.println("qq:"+new String(qq.getBytes("iso-8859-1"),"utf-8"));
8.HttpClient
軽量ブラウザで、リクエストとレスポンスをオブジェクトにカプセル化
GETリクエスト
new Thread(){
public void run() {
try {
String path = "http://192.168.1.103:8080/web/LoginServlet?qq="+URLEncoder.encode(qq, "utf-8")+"&pwd="+URLEncoder.encode(pwd, "utf-8");
//1.
HttpClient client = new DefaultHttpClient();
//2.
HttpGet httpGet = new HttpGet(path);
//3.
HttpResponse response = client.execute(httpGet);
//
int code = response.getStatusLine().getStatusCode();
if(code == 200){
InputStream is = response.getEntity().getContent();
String result = StreamTools.readStream(is);
Message msg = Message.obtain();
msg.what = SUCCESS;
msg.obj = result;
handler.sendMessage(msg);
}else{
Message msg = Message.obtain();
msg.what = ERROR;
handler.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
Message msg = Message.obtain();
msg.what = ERROR;
handler.sendMessage(msg);
}
};
}.start();
POSTリクエスト
new Thread(){
public void run() {
try {
String path = "http://192.168.1.103:8080/web/LoginServlet";
//1.
HttpClient client = new DefaultHttpClient();
//2.
HttpPost httpPost = new HttpPost(path);
List parameters = new ArrayList();
parameters.add(new BasicNameValuePair("qq", qq));
parameters.add(new BasicNameValuePair("pwd", pwd));
httpPost.setEntity(new UrlEncodedFormEntity(parameters, "utf-8"));
//3.
HttpResponse response = client.execute(httpPost);
//
int code = response.getStatusLine().getStatusCode();
if(code == 200){
InputStream is = response.getEntity().getContent();
String result = StreamTools.readStream(is);
Message msg = Message.obtain();
msg.what = SUCCESS;
msg.obj = result;
handler.sendMessage(msg);
}else{
Message msg = Message.obtain();
msg.what = ERROR;
handler.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
Message msg = Message.obtain();
msg.what = ERROR;
handler.sendMessage(msg);
}
};
}.start();
10.async-httpオープンソースフレームワークのGET要求
String path = "http://192.168.1.103:8080/web/LoginServlet?qq="+URLEncoder.encode(qq)+"&pwd="+URLEncoder.encode(pwd);
AsyncHttpClient client = new AsyncHttpClient();
client.get(path, new AsyncHttpResponseHandler() {
//
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
tv_status.setText(new String(responseBody));
}
//
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
tv_status.setText("http "+new String(responseBody));
}
});
11.async-httpオープンソースフレームワークのPOST要求
String path = "http://192.168.1.103:8080/web/LoginServlet";
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("qq", qq);
params.put("pwd", pwd);
client.post(path, params, new AsyncHttpResponseHandler(){
//
@Override
public void onSuccess(int statusCode, Header[] headers,
byte[] responseBody) {
tv_status.setText(" :"+new String(responseBody));
}
//
@Override
public void onFailure(int statusCode, Header[] headers,
byte[] responseBody, Throwable error) {
tv_status.setText(" ");
}
});
12.async-httpオープンソースフレームワークのファイルアップロード
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
try {
params.put("file", file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
client.post("http://192.168.1.103:8080/web/UploadServlet", params, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
Toast.makeText(MainActivity.this, " ", 0).show();
}
@Override
public void onFailure(int statusCode, Header[] headers,
byte[] responseBody, Throwable error) {
Toast.makeText(MainActivity.this, " ", 0).show();
}
});
15.マルチスレッドダウンロードの手順
16.サーバのリソースを異なるスレッドに分割する方法
int length = conn.getContentLength(); //
int blocksize = length / threadCount; // (n-1)
for (int threadId = 0; threadId < threadCount; threadId++) {
int startIndex = threadId * blocksize;
int endIndex = (threadId + 1) * blocksize - 1;
if (threadId == (threadCount - 1)) {
endIndex = length - 1;
}
}
17.マルチスレッドダウンロードファイル
//1. ,
RandomAccessFile raf = new RandomAccessFile(getFileName(path), "rw");
raf.setLength(length);
raf.close();
//2. “ ” “ ”
int length = conn.getContentLength(); //
int blocksize = length / threadCount; // (n-1)
for (int threadId = 0; threadId < threadCount; threadId++) {
int startIndex = threadId * blocksize;
int endIndex = (threadId + 1) * blocksize - 1;
if (threadId == (threadCount - 1)) {
endIndex = length - 1;
}
new DownloadThread(threadId, startIndex, endIndex).start();
}
//3. i
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Range", "bytes="+startIndex+"-"+endIndex);
InputStream is = conn.getInputStream();
//4. i ,
RandomAccessFile raf = new RandomAccessFile(getFileName(path), "rw");
raf.seek(startIndex);// .
18.ブレークポイント継続の原理
各スレッドのダウンロード進捗を記録し、次回のダウンロード時にその場所からダウンロードを開始します
19.マルチスレッドブレークポイントダウンロードの詳細
20.xUtilsを使用してマルチスレッドブレークポイントのダウンロードを完了する
HttpUtils http = new HttpUtils();
// :
// :
//
//
http.download(path, "/mnt/sdcard/xxx.exe", true, new RequestCallBack() {
//
@Override
public void onSuccess(ResponseInfo arg0) {
Toast.makeText(MainActivity.this, " ", 0).show();
}
//
@Override
public void onLoading(long total, long current, boolean isUploading) {
pb0.setMax((int) total);
pb0.setProgress((int) current);
super.onLoading(total, current, isUploading);
}
//
@Override
public void onFailure(HttpException arg0, String arg1) {
Toast.makeText(MainActivity.this, " "+arg1, 0).show();
}
});
21.まとめ