Android基礎(chǔ)第五天

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

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

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

做url請(qǐng)求時(shí)需要對(duì)參數(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請(qǐng)求服務(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)建一個(gè)httpClient對(duì)象
            HttpClient httpclient = new DefaultHttpClient();
            
            //2.設(shè)置請(qǐng)求的方式
            HttpGet httpget = new HttpGet(path);
            //3.執(zhí)行一個(gè)http請(qǐng)求
            HttpResponse response = httpclient.execute(httpget);
            //4.獲取請(qǐng)求的狀態(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請(qǐng)求返回的流信息
                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請(qǐng)求服務(wù)器將用戶密碼發(fā)送服務(wù)器驗(yàn)證
            try{
                    String path = "http://192.168.13.83:8080/itheima74/servlet/LoginServlet";
                    //1.創(chuàng)建一個(gè)httpclient對(duì)象
                    HttpClient httpclient = new DefaultHttpClient();
                    //2.創(chuàng)建一個(gè)請(qǐ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)建一個(gè)Entity
                    UrlEncodedFormEntity entity = new UrlEncodedFormEntity(arrayList, "utf-8");
                    //設(shè)置請(qǐng)求時(shí)的內(nèi)容
                    httppost.setEntity(entity);
                    
                    //3.執(zhí)行一個(gè)請(qǐng)求,返回一個(gè)response對(duì)象
                    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請(qǐng)求返回的流信息
                        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請(qǐng)求服務(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)建一個(gè)AsyncHttpClient對(duì)象
            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:請(qǐng)求時(shí)攜帶的參數(shù)信息   responseHandler:是一個(gè)匿名內(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 : 請(qǐng)求服務(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個(gè)赋除。

    多線程下載的步驟:

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

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對(duì)象
    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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末婚脱,一起剝皮案震驚了整個(gè)濱河市今魔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌起惕,老刑警劉巖涡贱,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異惹想,居然都是意外死亡问词,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門嘀粱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來激挪,“玉大人,你說我怎么就攤上這事锋叨÷⒎郑” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵娃磺,是天一觀的道長(zhǎng)薄湿。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么豺瘤? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任吆倦,我火速辦了婚禮,結(jié)果婚禮上坐求,老公的妹妹穿的比我還像新娘蚕泽。我一直安慰自己,他們只是感情好桥嗤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布须妻。 她就那樣靜靜地躺著,像睡著了一般泛领。 火紅的嫁衣襯著肌膚如雪荒吏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天师逸,我揣著相機(jī)與錄音司倚,去河邊找鬼。 笑死篓像,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的皿伺。 我是一名探鬼主播员辩,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼鸵鸥!你這毒婦竟也來了奠滑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤妒穴,失蹤者是張志新(化名)和其女友劉穎宋税,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體讼油,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡杰赛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了矮台。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乏屯。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瘦赫,靈堂內(nèi)的尸體忽然破棺而出辰晕,到底是詐尸還是另有隱情,我是刑警寧澤确虱,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布含友,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏窘问。R本人自食惡果不足惜扎唾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望南缓。 院中可真熱鬧胸遇,春花似錦、人聲如沸汉形。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽概疆。三九已至逗威,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間岔冀,已是汗流浹背凯旭。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留使套,地道東北人罐呼。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像侦高,于是被迫代替她去往敵國(guó)和親嫉柴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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

  • 經(jīng)驗(yàn):1.在網(wǎng)絡(luò)端接收數(shù)據(jù)后寫入本地時(shí)要用write(byte[],0,len),不要用write(byte[])...
    123yuan123閱讀 379評(píng)論 0 2
  • 一奉呛、簡(jiǎn)歷準(zhǔn)備 1计螺、個(gè)人技能 (1)自定義控件、UI設(shè)計(jì)瞧壮、常用動(dòng)畫特效 自定義控件 ①為什么要自定義控件登馒? Andr...
    lucas777閱讀 5,200評(píng)論 2 54
  • Android開發(fā)常見的第三方框架匯總 原創(chuàng)地址:http://blog.csdn.net/liuhaomatou...
    佑榮閱讀 1,028評(píng)論 0 1
  • 本文出自 Eddy Wiki ,轉(zhuǎn)載請(qǐng)注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 2,110評(píng)論 0 14
  • 我們知道大多數(shù)的 Android 應(yīng)用程序都是通過和服務(wù)器進(jìn)行交互來獲取數(shù)據(jù)的咆槽。如果使用 HTTP 協(xié)議來發(fā)送和接...
    OneAPM閱讀 3,093評(píng)論 5 25