最近在做自己的安卓软件,于是乎就自己做了个翻译功能,主要方式是使用AsyncTask实现异步处理,翻译调用的互联网接口是有道提供的API。
方法很简单,通过HttpGET和HttpResponse获得String,再将json数据解析即可。
在AsynTask实现类中,输入是String,在doInBackground方法里主要实现目标String的获取。而在onPostExecute方法里主要实现获取后对结果result的处理与解析。
其他过程就没啥好说的了:具体代码如下:
package com.example.myallfunprojects;import java.io.IOException;import org.apache.http.HttpResponse;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.util.EntityUtils;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import android.Manifest.permission;import android.app.Activity;import android.content.Context;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;import android.net.ConnectivityManager;import android.net.NetworkInfo;import android.os.AsyncTask;import android.os.Bundle;import android.view.KeyEvent;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;public class YouDaoTranslation extends Activity{ //控件 private Button btn_translate; private EditText edit; private TextView tv_result; //判断是否有网络 private ConnectivityManager connManager; private boolean hasNetwork = false; //进行有道翻译时用到的常量 private String YouDaoBaseUrl = "http://fanyi.youdao.com/openapi.do"; private String YouDaoDocType = "json"; private String YouDaoVersion = "1.1"; private String YouDaoType = "data"; private String YouDaoKeyFrom = "MyAllFunction2"; private String APIKey = "297337179"; private String search_Content; //数据保存使用 private String source_text = null; private String resultmessage = null; private SharedPreferences preference; private Editor editor; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.youdao_layout); init(); preference = getPreferences(Context.MODE_PRIVATE); editor = preference.edit(); edit.setText(preference.getString("source_text", "")); tv_result.setText(preference.getString("message", "")); //判断网络状态 connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); btn_translate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { NetworkInfo netinfo = connManager.getActiveNetworkInfo(); // TODO Auto-generated method stub //先检查网络状态 if (netinfo == null) { hasNetwork = false; Toast.makeText(getApplicationContext(), "当前不存在网络,请检查设置", Toast.LENGTH_SHORT).show(); } else { hasNetwork = true; search_Content = edit.getText().toString().trim(); source_text = search_Content; new Translate_Asynctask().execute(search_Content); } } }); } public void init() { btn_translate = (Button) findViewById(R.id.btn_translate); edit = (EditText) findViewById(R.id.et_text); tv_result = (TextView) findViewById(R.id.result_text); } /** * 通过Async实现异步操作 * @author sjm * */ private class Translate_Asynctask extends AsyncTask<String, Void, String> { //在执行时查询 @Override protected String doInBackground(String... params) { // TODO Auto-generated method stub if (hasNetwork == false) { return null; } String Url = YouDaoBaseUrl+"?keyfrom="+YouDaoKeyFrom+"&key="+APIKey+ "&type="+YouDaoType+"&doctype="+YouDaoDocType+"&version="+YouDaoVersion+ "&q="+params[0]; String result = null; //HttpGet HttpGet httpGet = new HttpGet(Url); //使用execute方法发送HTTPGET请求,并获得HTTPResponse响应 try { HttpResponse httpResponse = new DefaultHttpClient().execute(httpGet); if (httpResponse.getStatusLine().getStatusCode() == 200) { result = EntityUtils.toString(httpResponse.getEntity()); } } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return result; } @Override protected void onCancelled() { // TODO Auto-generated method stub super.onCancelled(); } @Override protected void onCancelled(String result) { // TODO Auto-generated method stub super.onCancelled(result); } @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub super.onPostExecute(result); if (result != null) { try { JSONArray jsonarray = new JSONArray("["+result+"]"); String message = null; for (int i = 0; i < jsonarray.length(); i++) { JSONObject object = jsonarray.getJSONObject(i); if (object != null) { String errorCode = object.getString("errorCode"); if (errorCode.equals("20")) { Toast.makeText(getApplicationContext(), "要翻译的文本过长", Toast.LENGTH_SHORT); } else if (errorCode.equals("30")) { Toast.makeText(getApplicationContext(), "无法进行有效的翻译", Toast.LENGTH_SHORT); } else if (errorCode.equals("40")) { Toast.makeText(getApplicationContext(), "不支持的语言类型", Toast.LENGTH_SHORT); } else if (errorCode.equals("50")) { Toast.makeText(getApplicationContext(), "无效的key", Toast.LENGTH_SHORT); } else { //取得要翻译的内容 String query = object.getString("query"); message = query; String translation = object.getString("translation"); message += "\t"+translation; if (object.has("basic")) { JSONObject basic_object = object.getJSONObject("basic"); if (basic_object.has("phonetic")) { String phonetic = basic_object.getString("phonetic"); message += "\n\t"+ phonetic; } if (basic_object.has("explains")) { String explains = basic_object.getString("explains"); message += "\n\t" + explains; } } if (object.has("web")) { String web = object.getString("web"); JSONArray webarray = new JSONArray("["+web+"]"); message += "\n网络释义:"; JSONArray webArray = webarray.getJSONArray(0); int count = 0; while(!webArray.isNull(count)){ if (webArray.getJSONObject(count).has("key")) { String key = webArray.getJSONObject(count).getString("key"); message += "\n\t<"+(count+1)+">" + key; } if (webArray.getJSONObject(count).has("value")) { String value = webArray.getJSONObject(count).getString("value"); message += "\n\t " + value; } count++; } } } } } resultmessage = message; tv_result.setText(message); editor.putString("source_text", source_text); editor.putString("message", resultmessage); editor.commit(); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else tv_result.setText("无网络,无法执行"); } @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); } @Override protected void onProgressUpdate(Void... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); } }}
版权声明:本文为博主原创文章,未经博主允许不得转载。