2013-03-30 20 views
0

過去3周左右我一直在學習Android編程,並且正在開發一個應用程序,該應用程序使用EditText將用戶的結果轉換爲使用Microsoft的用戶選擇的語言翻譯API。如何調用AsyncTask中的PopupMenu項目

我面對的問題是我無法讓應用程序讓用戶從菜單中選擇一種語言,然後翻譯EditText框中給出的文本。這個問題是由於我對AsyncTask不熟悉,我試圖運行應用程序而不使用它,但它會返回e異常。當我選擇一個默認的語言如下面的代碼

class MyAsyncTask extends AsyncTask<Void, Integer, Boolean> { 
    @Override 
    protected Boolean doInBackground(Void... arg0) { 
     Translate.setClientId("MicrosoftTranslatorJavaAPI"); 
     Translate.setClientSecret(secret_key); 


     try { 
      translatedText = Translate.execute(et.getText().toString(), Language.ENGLISH, Language.FRENCH); 
     } catch(Exception e) { 
      translatedText = e.toString(); 
     } 
     return true; 
    } 
} 

任何幫助,將不勝感激

以下是完整的代碼,但它確實工作。

的java文件

public class MicrosoftTranslatorAndroidTestActivity extends Activity { 
    /** Called when the activity is first created. */ 
    TextView text; 
    String translatedText; 
    EditText et; 
    PopupMenu popupMenu; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 
     et=(EditText) findViewById(R.id.editText1); 
     Button b=(Button) findViewById(R.id.button1); 

     text = (TextView) findViewById(R.id.tv1); 
     text.setText("<This text should change after translation has occurred in AsyncTask>"); 
     b.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 
        popupMenu = new PopupMenu(MicrosoftTranslatorAndroidTestActivity.this, v); 
        popupMenu.getMenuInflater().inflate(R.menu.popmenu, popupMenu.getMenu()); 
       new MyAsyncTask() { 
        protected void onPostExecute(Boolean result) { 
         text.setText(translatedText); 
        } 
       }.execute(); 
       popupMenu.show(); 
      } 
     }); 



} 

class MyAsyncTask extends AsyncTask<Void, Integer, Boolean> { 
    @Override 
    protected Boolean doInBackground(Void... arg0) { 
     Translate.setClientId("MicrosoftTranslatorJavaAPI"); 
     Translate.setClientSecret(secret_key); 

     popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 

      public boolean onMenuItemClick(MenuItem item) { 
       // TODO Auto-generated method stub 
       switch (item.getItemId()){ 

       case R.id.ar: 

        try { 
         translatedText = Translate.execute(et.getText().toString(), Language.ENGLISH, Language.ARABIC); 
        } catch(Exception e) { 
         translatedText = e.toString(); 
        } 

        break; 

       case R.id.fr: 

        try { 
         translatedText = Translate.execute(et.getText().toString(), Language.ENGLISH, Language.FRENCH); 
        } catch(Exception e) { 
         translatedText = e.toString(); 
        } 

        break; 

       case R.id.sp: 

        try { 
         translatedText = Translate.execute(et.getText().toString(), Language.ENGLISH, Language.SPANISH); 
        } catch(Exception e) { 
         translatedText = e.toString(); 
        } 

        break; 
        default: 
        break; 


       } 


       return true; 
      } 
     }); 


     return true; 
    } 
} 
+0

'它會返回電子exception'。你明白什麼是例外嗎?請說,如果你不這樣做。順便說一句,由於顯而易見的原因,你不應該發佈你的密鑰。我已將其刪除。 – Simon

+0

@Simon我的意思是說它不會返回翻譯結果,而是。 translationText變量會返回類似於「java.lang.exception。[microsoft-translator-api]錯誤檢索翻譯:null」 – aasg

+0

請從logcat發佈堆棧跟蹤 – Simon

回答

0

您無法訪問用戶界面的方法(例如啓動彈出菜單)從後臺線程。

更重要的是,這會導致顯示彈出窗口,但runInBackgroundMethod會在任何情況下完成,並且不會調用您的translate.execute。

您必須將異步交互與來自與UI元素的交互的轉換解耦。 假設您需要在後臺線程中執行Translate.execute()方法,您應該做的是在啓動backgound線程之前獲取翻譯參數,並在您的asyncthread的onPostExecute()中獲取結果。

喜歡的東西

private class TranslateTask extends AsyncTask<String, Void, String> { 
    protected void onProgressUpdate() { 

    } 

    protected void onPostExecute(String... result) { 
     String translated = result[0]; 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     String toTranslate = params[0]; 
     String language = params[1]; 
       // translate here and return the result 
       return translated; 
      } 
} 

,然後調用

translateTask.execute(toTranslate, language); 
相關問題