仿照网上其他人调用有道翻译API时遇到http通信问题,运用AsynTask

前几天想学学Android怎么跟服务器进行通信,想起了以前看到的有道翻译API,觉得本人的渣渣功底应该可以照着别人的来做一个调用有道翻译API的小软件,但是照着别人的代码,我怎么也接受不到服务器端发来的json数据,最后经过我疯狂打log,才知道问题所在,再加上网上的一些答案,才知道别人写那些代码是还是用10以下的sdk,10以上的sdk的网络请求需要另起线程,也有的说是Android4.0HttpClient不能在主线程发起请求,总之就是得另起线程。


   String totalMessage = null;
            HttpGet httpGet = new HttpGet(strings[0]);//问题出在这行,程序到这里后就不打log了,也没报错,没有崩溃
            try {
                HttpResponse httpResponse = new DefaultHttpClient().execute(httpGet);           
                if (httpResponse.getStatusLine().getStatusCode() == 200) {----------dosomething--------}
<span style="white-space:pre">	</span>    catch(IOException e){
<span style="white-space:pre">	</span> <span style="white-space:pre">		</span>e.printStackTrace();
<span style="white-space:pre">		</span>}
一开始以为是我的请求格式发生了错误,改了几次后发现没有错,最后看网上说需要另起线程,看了有两种方法,继承Thread,之后把要更新的UI的信息装成Message,发送出去,由主线程的Handler处理改变UI,还有一种方法就是异步,创建一个类继承AsynTask<Params,Progress,Result>,并覆盖器方法。

这里拿了别人的参数介绍。

AsyncTask定义了三种泛型类型 Params,Progress和Result。

  • Params 启动任务执行的输入参数,比如HTTP请求的URL。
  • Progress 后台任务执行的百分比。
  • Result 后台执行任务最终返回的结果,比如String.

private class requestTranslation extends AsyncTask<String, Integer, String> {
        @Override
        protected String doInBackground(String... strings) {//这里是执行网络请求的方法,第一个参数对应的是请求服务器的URL,所以是String,在主函数中运用
//new requestTranslation().execute(URL);就可以了,由于是要有道翻译API,改变UI的应该是一些文字
//所以第三个参数返回String,给onPostExecute()方法,让它来改变UI
            String totalMessage = null;
            HttpGet httpGet = new HttpGet(strings[0]);          
            try {
                HttpResponse httpResponse = new DefaultHttpClient().execute(httpGet);              
                if (httpResponse.getStatusLine().getStatusCode() == 200) {
//接下来是一些向有道翻译请求json数据的操作,照着别人网上抄的                
                    String result = EntityUtils.toString(httpResponse.getEntity());
                    JSONArray jsonArray = new JSONArray("[" + result + "]");                
                    for (int i = 0; i < 1/*jsonArray.length()*/; i++) {//这里不知别人为何要循环,我看着有道API的Json格式好像并没有数组,我试了下长度1也行                    
                        JSONObject jsonObject = jsonArray.getJSONObject(i);
                        if (jsonObject != null) {                         
                            String errorCode = jsonObject.getString("errorCode");
                            if (errorCode.equals(20)) {
                                totalMessage="20";
                            } else if (errorCode.equals(30)) {
                                totalMessage="30";
                            } else if (errorCode.equals(40)) {
                                totalMessage="40";
                            } else if (errorCode.equals(50)) {
                                totalMessage="50";
                            } else if (errorCode.equals(60)) {
                                totalMessage="60";
                            } else {
                                String query = jsonObject.getString("query");
                                totalMessage = query;
                                String tranSation = jsonObject.getString("translation");
                                totalMessage += "\t" + tranSation;
                                if (jsonObject.has("basic")) {                                   
                                    JSONObject basic = jsonObject.getJSONObject("basic");
                                    if (basic.has("phonetic")) {
                                        String phonetic = basic.getString("phonetic");
                                        totalMessage += "\n\t" + phonetic;
                                    }
                                    if (basic.has("explains")) {
                                        String explains = basic.getString("explains");
                                        totalMessage += "\n\t" + explains;
                                    }
                                }

                                if (jsonObject.has("web")) {                                
                                    String web = jsonObject.getString("web");
                                    totalMessage += "\n网络释义:";
                                    JSONArray webArray=new JSONArray(web);
                                    int count = 0;
                                    while (!webArray.isNull(count)) {
                                        if (webArray.getJSONObject(count).has("key")) {
                                            String key = webArray.getJSONObject(count).getString("key");
                                            totalMessage += "\n\t" + (count + 1)+"、" + key;
                                        }
                                        if (webArray.getJSONObject(count).has("value")) {
                                            String value = webArray.getJSONObject(count).getString("value");
                                            totalMessage += "\n\t" + value+"\n";
                                        }
                                        count++;
                                    }
                                }
                                
                            }
                        }
                    }

                } else {             
                    totalMessage="请求异常";
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return totalMessage;//最后把数据返回给onPostExecute(String s)方法

        }

        @Override
        protected void onPostExecute(String s) {//这是发起网络请求后改变UI的方法,该方法拿到翻译的文字String后,改变UI
            super.onPostExecute(s);
            if (s.equals(20)) {
                TranslatedText.setText(R.string.warn_long);
            } else if (s.equals(30)) {
                TranslatedText.setText(R.string.warn_disabletranslation);
            } else if (s.equals(40)) {
                TranslatedText.setText(R.string.warn_nosupport);
            } else if (s.equals(50)) {
                TranslatedText.setText(R.string.warn_disablekey);
            } else if (s.equals(60)) {
                TranslatedText.setText(R.string.warn_noanswer);
            } else {
                TranslatedText.setText(s);
            }
        }
    }



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值