Android-GETリクエスト、POSTリクエスト、データコミット、エンコード、HttpClient、async-httpオープンソースフレームワーク、マルチスレッドダウンロード、ブレークポイント継続、xUtilsフレームワーク

14375 ワード

転載は出典を明記してください.https://blog.csdn.net/mythmayor/article/details/72869238
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
Android - GET请求,POST请求,数据提交,编码,HttpClient,async-http开源框架,多线程下载,断点续传,xUtils框架_第1张图片
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デフォルトコードテーブル
  • 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.提出データに中国語が含まれている注意事項
    クライアント
    //           ,    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
    軽量ブラウザで、リクエストとレスポンスをオブジェクトにカプセル化
  • ブラウザ
  • を開く
  • 入力アドレス(データ)
  • ノックアウト
  • 9.HttpClientのGETとPOSTリクエスト
    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オープンソースフレームワークのファイルアップロード
  • ファイルアップロードの原理
  • ファイルアップロードは、POSTリクエスト
  • です.
  • Content-typeはmultipart/form-data
  • 具体コード
    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();
        }
    
    });
    
  • 13.マルチスレッドダウンロード
  • マルチスレッド同時動作
  • ネットワーク要求
  • 14.マルチスレッドがダウンロード速度を向上させる理由
  • サーバから取得するリソースが多くなり、単位時間当たりのダウンロード速度が速くなる.
  • のダウンロード速度は、サーバのアップロード帯域幅およびユーザのダウンロード帯域幅によっても制限される
  • .
    15.マルチスレッドダウンロードの手順
  • クライアントのローカルに空白のファイルを作成します.ファイルのサイズはサーバと同じです.RandomAccessFile
  • サーバのリソースをダウンロードするために複数のスレッドを開く
  • すべてのスレッドがダウンロード完了すると、マルチスレッドダウンロードは
  • を終了する.
    Android - GET请求,POST请求,数据提交,编码,HttpClient,async-http开源框架,多线程下载,断点续传,xUtils框架_第2张图片
    Android - GET请求,POST请求,数据提交,编码,HttpClient,async-http开源框架,多线程下载,断点续传,xUtils框架_第3张图片
    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.マルチスレッドブレークポイントダウンロードの詳細
  • ダウンロードタスクごとに自分の進捗を記録するファイル
  • が必要です.
  • ダウンロード完了後、記録ファイル
  • を削除
  • synchronizeコードブロック
  • の同期使用を保証する
  • FileOutputStreamデータを使用するとストレージデバイスに毎回書き込まれるとは限らず、ハードディスクのキャッシュに書き込まれる可能性があり、RandomAccessFileを使用してモードをrwdに設定することで、毎回ディスクにデータが書き込まれることを保証できる
  • .
    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.まとめ
  • サーバへのデータの送信
  • GETとPOST要求方式の違い
  • 中国語の文字化けしの原因、解決方法
  • 提出したデータには中国語の解決方法が含まれている
  • HttpURLConnectionによるGETおよびPOSTコミット
  • HttpClientを使用してGETとPOST提出
  • を行う.
  • オープンソースフレームワークasync-httpを使用してGET、POSTコミット、アップロードファイル
  • を行う.
  • マルチスレッドブレークポイントダウンロード
  • マルチスレッドブレークポイントダウンロードの原理
  • マルチスレッドブレークポイントダウンロードのステップ
  • サーバデータの一部を取得する方法
  • 取得データをローカルファイルの一部
  • に書き込む方法
  • マルチスレッドブレークポイントダウンロードの詳細
  • で完了したのはおもちゃコードのみで、実際のプロジェクトでは
  • は使用できません.
  • オープンソースプロジェクトxUtilsを使用して、マルチスレッドブレークポイントダウンロード
  • を実現