Translate.java
上传用户:xmjingguan
上传日期:2009-07-06
资源大小:2054k
文件大小:7k
源码类别:

android开发

开发平台:

Java

  1. /***
  2.  * Excerpted from "Hello, Android!",
  3.  * published by The Pragmatic Bookshelf.
  4.  * Copyrights apply to this code. It may not be used to create training material, 
  5.  * courses, books, articles, and the like. Contact us if you are in doubt.
  6.  * We make no guarantees that this code is fit for any purpose. 
  7.  * Visit http://www.pragmaticprogrammer.com/titles/eband for more book information.
  8. ***/
  9. package org.example.translate;
  10. import java.util.concurrent.ExecutorService;
  11. import java.util.concurrent.Executors;
  12. import java.util.concurrent.Future;
  13. import java.util.concurrent.RejectedExecutionException;
  14. import android.app.Activity;
  15. import android.os.Bundle;
  16. import android.os.Handler;
  17. import android.text.Editable;
  18. import android.text.TextWatcher;
  19. import android.view.View;
  20. import android.widget.AdapterView;
  21. import android.widget.ArrayAdapter;
  22. import android.widget.EditText;
  23. import android.widget.Spinner;
  24. import android.widget.TextView;
  25. import android.widget.AdapterView.OnItemSelectedListener;
  26. public class Translate extends Activity {
  27.    private Spinner fromSpinner;
  28.    private Spinner toSpinner;
  29.    private EditText origText;
  30.    private TextView transText;
  31.    private TextView retransText;
  32.    private TextWatcher textWatcher;
  33.    private OnItemSelectedListener itemListener;
  34.    private Handler guiThread;
  35.    private ExecutorService transThread;
  36.    private Runnable updateTask;
  37.    private Future transPending;
  38.    @Override
  39.    public void onCreate(Bundle savedInstanceState) { 
  40.       super.onCreate(savedInstanceState);
  41.       setContentView(R.layout.main);
  42.       initThreading();
  43.       findViews(); 
  44.       setAdapters(); 
  45.       setListeners(); 
  46.    }
  47.    
  48.    @Override
  49.    protected void onDestroy() {
  50.       // Terminate extra threads here
  51.       transThread.shutdownNow();
  52.       super.onDestroy();
  53.    }
  54.    
  55.    /** Get a handle to all user interface elements */
  56.    private void findViews() {
  57.       fromSpinner = (Spinner) findViewById(R.id.from_language);
  58.       toSpinner = (Spinner) findViewById(R.id.to_language);
  59.       origText = (EditText) findViewById(R.id.original_text);
  60.       transText = (TextView) findViewById(R.id.translated_text);
  61.       retransText = (TextView) findViewById(R.id.retranslated_text);
  62.    }
  63.    
  64.    
  65.    /** Define data source for the spinners */
  66.    private void setAdapters() {
  67.       // Spinner list comes from a resource,
  68.       // Spinner user interface uses standard layouts
  69.       ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
  70.             this, R.array.languages,
  71.             android.R.layout.simple_spinner_item);
  72.       adapter.setDropDownViewResource(
  73.             android.R.layout.simple_spinner_dropdown_item);
  74.       fromSpinner.setAdapter(adapter);
  75.       toSpinner.setAdapter(adapter);
  76.       // Automatically select two spinner items
  77.       fromSpinner.setSelection(8); // English (en)
  78.       toSpinner.setSelection(11); // French (fr)
  79.    }
  80.    
  81.    
  82.    /** Setup user interface event handlers */
  83.    private void setListeners() {
  84.       // Define event listeners
  85.       textWatcher = new TextWatcher() {
  86.          public void beforeTextChanged(CharSequence s, int start,
  87.                int count, int after) {
  88.             /* Do nothing */
  89.          }
  90.          public void onTextChanged(CharSequence s, int start,
  91.                int before, int count) {
  92.             queueUpdate(1000 /* milliseconds */);
  93.          }
  94.          public void afterTextChanged(Editable s) {
  95.             /* Do nothing */
  96.          }
  97.       };
  98.       itemListener = new OnItemSelectedListener() {
  99.          public void onItemSelected(AdapterView parent, View v,
  100.                int position, long id) {
  101.             queueUpdate(200 /* milliseconds */);
  102.          }
  103.          public void onNothingSelected(AdapterView parent) {
  104.             /* Do nothing */
  105.          }
  106.       };
  107.       // Set listeners on graphical user interface widgets
  108.       origText.addTextChangedListener(textWatcher);
  109.       fromSpinner.setOnItemSelectedListener(itemListener);
  110.       toSpinner.setOnItemSelectedListener(itemListener);
  111.    }
  112.    
  113.    
  114.    /**
  115.     * Initialize multi-threading. There are two threads: 1) The main
  116.     * graphical user interface thread already started by Android,
  117.     * and 2) The translate thread, which we start using an executor.
  118.     */
  119.    private void initThreading() {
  120.       guiThread = new Handler();
  121.       transThread = Executors.newSingleThreadExecutor();
  122.       // This task does a translation and updates the screen
  123.       updateTask = new Runnable() { 
  124.          public void run() {
  125.             // Get text to translate
  126.             String original = origText.getText().toString().trim();
  127.             // Cancel previous translation if there was one
  128.             if (transPending != null)
  129.                transPending.cancel(true); 
  130.             // Take care of the easy case
  131.             if (original.length() == 0) {
  132.                transText.setText(R.string.empty); 
  133.                retransText.setText(R.string.empty);
  134.             } else {
  135.                // Let user know we're doing something
  136.                transText.setText(R.string.translating); 
  137.                retransText.setText(R.string.translating);
  138.                // Begin translation now but don't wait for it
  139.                try {
  140.                   TranslateTask translateTask = new TranslateTask( 
  141.                         Translate.this, // reference to activity
  142.                         original, // original text
  143.                         getLang(fromSpinner), // from language
  144.                         getLang(toSpinner) // to language
  145.                   );
  146.                   transPending = transThread.submit(translateTask); 
  147.                } catch (RejectedExecutionException e) {
  148.                   // Unable to start new task
  149.                   transText.setText(R.string.translation_error); 
  150.                   retransText.setText(R.string.translation_error);
  151.                }
  152.             }
  153.          }
  154.       };
  155.    }
  156.    
  157.    
  158.    /** Extract the language code from the current spinner item */
  159.    private String getLang(Spinner spinner) {
  160.       String result = spinner.getSelectedItem().toString();
  161.       int lparen = result.indexOf('(');
  162.       int rparen = result.indexOf(')');
  163.       result = result.substring(lparen + 1, rparen);
  164.       return result;
  165.    }
  166.    /** Request an update to start after a short delay */
  167.    private void queueUpdate(long delayMillis) {
  168.       // Cancel previous update if it hasn't started yet
  169.       guiThread.removeCallbacks(updateTask);
  170.       // Start an update if nothing happens after a few milliseconds
  171.       guiThread.postDelayed(updateTask, delayMillis);
  172.    }
  173.    /** Modify text on the screen (called from another thread) */
  174.    public void setTranslated(String text) {
  175.       guiSetText(transText, text);
  176.    }
  177.    /** Modify text on the screen (called from another thread) */
  178.    public void setRetranslated(String text) {
  179.       guiSetText(retransText, text);
  180.    }
  181.    /** All changes to the GUI must be done in the GUI thread */
  182.    private void guiSetText(final TextView view, final String text) {
  183.       guiThread.post(new Runnable() {
  184.          public void run() {
  185.             view.setText(text);
  186.          }
  187.       });
  188.    }
  189.    
  190.    
  191. }