2013-03-30 2 views
0

지난 3 주 동안 Android 프로그래밍을 배우고 있으며 EditText를 사용하여 사용자의 결과를 가져와 Microsoft를 사용하여 선택한 언어로 번역하는 앱을 개발하고 있습니다. Translate 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; 
    } 
} 

어떤 도움이 여기에

감사 전체 코드 인 것 같이 내가 하나 개의 기본 언어를 선택할 때 그것은 그러나 작동 않습니다.

자바 파일

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'을 반환 호출합니다. 예외가 무엇인지 이해합니까? 그렇지 않으면 말하십시오. BTW, 명백한 이유로, 당신은 당신의 열쇠를 게시해서는 안됩니다. 나는 그것을 제거했습니다. – Simon

+0

@Simon은 번역 된 결과를 반환하지 않는다고 말했습니다. translatedText 변수는 "java.lang.exception. [번역을 불러오는 중 오류가 발생했습니다 : Microsoft-translator-api] – aasg

+0

와 같은 것을 반환합니다. logcat에서 스택 추적을 게시하십시오. – Simon

답변

0

당신은 백그라운드 스레드에서 (예 : 팝업 메뉴를 실행 등) UI 방법에 액세스 할 수 없습니다.

그 이상의 결과로 팝업이 표시되지만 결과적으로 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);