Android基礎(chǔ)第五天

Android基礎(chǔ)網(wǎng)絡(luò)第二天

1 post方式提交數(shù)據(jù)亂碼的解決

一般在公司開發(fā)客戶端和服務(wù)端的編碼要保持一致。
android端的默認(rèn)編碼是utf-8;

做url請求時需要對參數(shù)進(jìn)行URLEncode編碼.

URL url = new URL("http://192.168.13.83:8080/itheima74/servlet/LoginServlet?username="+URLEncoder.encode(username)+"&pwd="+URLEncoder.encode(password));


connection.setDoOutput(true);
connection.getOutputStream().write(parmes.getBytes());

2 get方式提交數(shù)據(jù)亂碼解決

URLEncode

3 httpclient方式提交數(shù)據(jù)到服務(wù)器

 HttpClient:

get方式:
        //使用HttpClient請求服務(wù)器將用戶密碼發(fā)送服務(wù)器驗(yàn)證
            try{
            String path = "http://192.168.13.83:8080/itheima74/servlet/LoginServlet?username="+URLEncoder.encode(username,"utf-8")+"&pwd="+URLEncoder.encode(password,"utf-8");
            //1.創(chuàng)建一個httpClient對象
            HttpClient httpclient = new DefaultHttpClient();
            
            //2.設(shè)置請求的方式
            HttpGet httpget = new HttpGet(path);
            //3.執(zhí)行一個http請求
            HttpResponse response = httpclient.execute(httpget);
            //4.獲取請求的狀態(tài)碼,
            StatusLine statusLine = response.getStatusLine();
            int code = statusLine.getStatusCode();
            
            //5.判斷狀態(tài)碼后獲取內(nèi)容
            if(code == 200){
                HttpEntity entity = response.getEntity();//獲取實(shí)體內(nèi)容,中封裝的有http請求返回的流信息
                InputStream inputStream = entity.getContent();
                //將流信息轉(zhuǎn)換成字符串
                String result = StreamUtils.streamToString(inputStream);
                
                Message msg = Message.obtain();
                msg.what = 1;
                msg.obj = result;
                handler.sendMessage(msg);
            }
            
            }catch (Exception e) {
                e.printStackTrace();
            }
post方式:


        //使用UrlConncetion請求服務(wù)器將用戶密碼發(fā)送服務(wù)器驗(yàn)證
            try{
                    String path = "http://192.168.13.83:8080/itheima74/servlet/LoginServlet";
                    //1.創(chuàng)建一個httpclient對象
                    HttpClient httpclient = new DefaultHttpClient();
                    //2.創(chuàng)建一個請求方式
                    HttpPost httppost = new HttpPost(path);
                    //創(chuàng)建集合封裝數(shù)據(jù)
                    ArrayList<BasicNameValuePair> arrayList = new ArrayList<BasicNameValuePair>();
                    BasicNameValuePair nameValuePair = new BasicNameValuePair("username",username);
                    arrayList.add(nameValuePair);
                    BasicNameValuePair nameValuePair1 = new BasicNameValuePair("pwd",password);
                    arrayList.add(nameValuePair1);
                    
                    //創(chuàng)建一個Entity
                    UrlEncodedFormEntity entity = new UrlEncodedFormEntity(arrayList, "utf-8");
                    //設(shè)置請求時的內(nèi)容
                    httppost.setEntity(entity);
                    
                    //3.執(zhí)行一個請求,返回一個response對象
                    HttpResponse response = httpclient.execute(httppost);
                    //4.獲取狀態(tài)碼
                    int code = response.getStatusLine().getStatusCode();
                    //5.判斷并獲取內(nèi)容
                    if(code == 200){
                        HttpEntity entity1 = response.getEntity();//獲取實(shí)體內(nèi)容,中封裝的有http請求返回的流信息
                        InputStream inputStream = entity1.getContent();
                        //將流信息轉(zhuǎn)換成字符串
                        String result = StreamUtils.streamToString(inputStream);
                        Message msg = Message.obtain();
                        msg.what = 2;
                        msg.obj = result;
                        handler.sendMessage(msg);
                    }

            }catch (Exception e) {
                e.printStackTrace();
            }

4開源項(xiàng)目get post 方式提交 (asyncHttpClient)

    get方式:


                public static void requestNetForGetLogin(final Context context,final Handler handler ,final String username, final String password) {
            //使用HttpClient請求服務(wù)器將用戶密碼發(fā)送服務(wù)器驗(yàn)證
            try{
            String path = "http://192.168.13.83:8080/itheima74/servlet/LoginServlet?username="+URLEncoder.encode(username,"utf-8")+"&pwd="+URLEncoder.encode(password,"utf-8");
    
            //創(chuàng)建一個AsyncHttpClient對象
            AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
            asyncHttpClient.get(path, new AsyncHttpResponseHandler() {
                
                @Override
                public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                    //statusCode:狀態(tài)碼    headers:頭信息  responseBody:返回的內(nèi)容,返回的實(shí)體
                    //判斷狀態(tài)碼
                    if(statusCode == 200){
                        //獲取結(jié)果
                        try {
                            String result = new String(responseBody,"utf-8");
                            Toast.makeText(context, result, 0).show();
                        } catch (UnsupportedEncodingException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
                
                @Override
                public void onFailure(int statusCode, Header[] headers,
                        byte[] responseBody, Throwable error) {
                    
                    System.out.println("...............onFailure");
                    
                }
            });
            }catch (Exception e) {
                e.printStackTrace();
            }
}


    post方式:


                String path = "http://192.168.13.83:8080/itheima74/servlet/LoginServlet";

        AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
        RequestParams params = new RequestParams();
        params.put("username", username);
        params.put("pwd", password);
        
        //url:   parmas:請求時攜帶的參數(shù)信息   responseHandler:是一個匿名內(nèi)部類接受成功過失敗
        asyncHttpClient.post(path, params, new AsyncHttpResponseHandler() {
            
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                //statusCode:狀態(tài)碼    headers:頭信息  responseBody:返回的內(nèi)容,返回的實(shí)體
                
                //判斷狀態(tài)碼
                if(statusCode == 200){
                    //獲取結(jié)果
                    try {
                        String result = new String(responseBody,"utf-8");
                        Toast.makeText(context, result, 0).show();
                    } catch (UnsupportedEncodingException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                
            }
            
            @Override
            public void onFailure(int statusCode, Header[] headers,
                    byte[] responseBody, Throwable error) {
                
            }
        });

5 文件上傳的操作

    使用第三方utils做文件上傳。
        
public void fileupload(View v){
    try{
    EditText et_filepath = (EditText) findViewById(R.id.et_filepath);
    //獲取輸入的文件地址
    String filepath = et_filepath.getText().toString().trim();
    
    //使用開源Utils做上傳操作
    AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
    
    RequestParams params = new RequestParams();
    params.put("filename", new File(filepath));
    //url : 請求服務(wù)器的url
    asyncHttpClient.post("http://192.168.13.83:8080/itheima74/servlet/UploaderServlet", params, new AsyncHttpResponseHandler() {
        
        @Override
        public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
            if(statusCode == 200){
                Toast.makeText(MainActivity.this, "上傳成功", 0).show();
            }
        }
        @Override
        public void onFailure(int statusCode, Header[] headers,
                byte[] responseBody, Throwable error) {
        }
    });
    
    }catch (Exception e) {
        e.printStackTrace();
    }
}

6 多線程加速下載的原理

    1.線程越多下載越快?? 不是。 與 本地網(wǎng)絡(luò)帶寬, 服務(wù)器資源的帶寬 有關(guān)
    2.迅雷:3-5個。

    多線程下載的步驟:

    1.要知道服務(wù)端資源的大小。
    
        通過URLConnection請求服務(wù)器url獲取。
        UrlConnection.getContentLength();//資源的大小
        
    2.在本地創(chuàng)建一個與服務(wù)端資源同樣大小的一個文件(占位)
            //file :  文件; mode:文件的模式,rwd:直接寫到底層設(shè)備,硬盤
            RandomAccessFile randomfile =new RandomAccessFile(File file,String mode)
                
            randomfile.setLength(long size);//創(chuàng)建一個文件和服務(wù)器資源一樣大小
            
    3.要分配每個線程下載文件的開始位置和結(jié)束位置。
            
    4.開啟線程去執(zhí)行下載
            通過UrlConnection下載部分資源。
            注意:
             1.需要Range頭,key:Range   value:bytes:0-499 
                    urlconnection.setRequestPropety("Range","bytes:0-499")
             2.需要設(shè)置每個線程在本地文件的保存的開始位置
                    RandomAccessFile randomfile =new RandomAccessFile(File file,String mode)
                    randomfile.seek(int startPostion);//本次線程下載保存的開始位置。
                    
    5.要知道每個線程下載完畢。

7 javase 多線程下載

8 多線程斷點(diǎn)續(xù)傳實(shí)現(xiàn)

9 Android版本多線程下載

        安智: sdcard沒有判斷。uc

10 開源項(xiàng)目實(shí)現(xiàn)多線程下載 (xutils)

    public void download(View v){
    EditText et_url = (EditText) findViewById(R.id.et_url);
    String url = et_url.getText().toString().trim();
    //1.創(chuàng)建httpUtils對象
    HttpUtils httpUtils = new HttpUtils();
    //2.調(diào)用download方法  url:下載的地址  target:下載的目錄   callback:回調(diào) 
    httpUtils.download(url, "/sdcard/feiqiu/feiq.exe", new RequestCallBack<File>() {
        @Override
        public void onLoading(long total, long current, boolean isUploading) {
            System.out.println("total:"+total+";current:"+current);
            super.onLoading(total, current, isUploading);
        }
        @Override
        public void onSuccess(ResponseInfo<File> responseInfo) {
            System.out.println(responseInfo.result);
        }
        @Override
        public void onFailure(HttpException error, String msg) {
            // TODO Auto-generated method stub
            
        }
    });
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,460評論 6 538
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,067評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,467評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,468評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,184評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,582評論 1 325
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,616評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,794評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,343評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,096評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,291評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,863評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,513評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,941評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,190評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,026評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,253評論 2 375

推薦閱讀更多精彩內(nèi)容