前几天想学学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);
}
}
}