Google 翻訳と Microsoft 翻訳を試しました。どちらもエラーを出します:
[microsoft-translator-api] 翻訳の取得中にエラーが発生しました: null
原因: android.os.NetworkOnMainThreadException
リファレンスとチュートリアルに従ってすべてをセットアップしました。唯一の違いは、ボタンのクリックで Translate.execute() を呼び出す代わりに、JSON 文字列データが入り始めるときに呼び出すようにしていることです。
ここに私が持っているものがあります:
私のデータモデルクラスで
public String getName() throws Exception {
String trans = Translate.execute(prod_name, Language.ENGLISH, Language.fromString(Locale.getDefault().getLanguage()));
return trans;
}
私もこれを試しました:
私のデータモデルクラスで
public String getName(){
return prod_name;
}
これに加えて:
主な活動
JsonArrayRequest request = new JsonArrayRequest(FEAT_URL,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
Log.d(TAG, response.toString()); try {
for(int i=0;i<response.length();i++){
String pid=response.getJSONObject(i).getString("pid");
String name=response.getJSONObject(i).getString("prod_name");
String img = response.getJSONObject(i).getString("prod_pic");
String lang = Locale.getDefault().getLanguage();
Log.d("Response: ", name);
String trans = Translate.execute(name, Language.SPANISH, Language.fromString(lang));
fdata.add(new FeaturedModel(pid, trans, img));
}
} catch (Exception e) {
e.printStackTrace();
} featAdapt=new FeaturedAdapter(MainActivity.this, fdata);
pageView.setAdapter(featAdapt);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d(TAG, "Error: " + error.getMessage());
}
});
VolleyController.getInstance().addToRequestQueue(request, TAG);
Android の Translate API に関する他の SO の質問を見たことがありますが、それらはすべて、ビューをクリックして翻訳を取得することに言及しています。Volley リクエストから JSON 文字列レスポンスを変換する例を示すものは見つかりませんでした。何か案は?メインスレッドを過負荷にせずにこれを行う適切な方法は何でしょうか?
以下のコメント ごとに、この AsyncTask クラスを MainActivity に追加しました。
class TranslateAsync extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... inTxt) {
try {
String lang = Locale.getDefault().getLanguage();
translatedText = Translate.execute(inTxt, Language.fromString(lang));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.e("Translate Error", e.toString());
}
return null;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
}
}
そして、アダプタークラスのこの行でメソッド setText(String[]) を解決できないというエラーが表示されます。
holder.ftitle.setText(feature.get(position).getName());
Google と Microsoft Translator API の両方を見ると、String[] が必要です。