質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

3回答

3403閲覧

オーバライドされた、voidメソッドから戻り値を取りたいです。

s.k

総合スコア423

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

1クリップ

投稿2017/06/02 01:55

編集2017/06/02 03:03

###前提・実現したいこと
フラグメントを使用したいです。
setListAdapterの第三引数にJSONデータを取得するメソッドを起きましたが、
そのメソッドはvoid型で、スコープの関係上戻り値を取得できないことに気がつきました。

※第三引数自体にあるメソッド自体は戻り値があります。そのメソッドの中にvoid型メソッドがあり、そのメソッドはオーバライドされたものです。

###発生している問題・エラーメッセージ

ターミナル

06-02 10:31:19.326 7854-7854/station.around.aroundsatation I/System.out: あ 06-02 10:31:19.326 7854-7854/station.around.aroundsatation I/System.out: [] ★戻り値(スコープで空になってしまう。)★ 06-02 10:31:19.326 7854-7854/station.around.aroundsatation I/System.out: い

###該当のソースコード

Java

1 2public class HttpConnect { 3 4 public List<String> lists = new ArrayList<String>(); ★① 5 6 public List<String> showMember(){★②戻り値があるメソッド 7 Retrofit retrofit = new Retrofit.Builder() 8 .baseUrl("http://candii.tk/") 9 .addConverterFactory(GsonConverterFactory.create()) 10 .build(); 11 ImageClient service = retrofit.create(ImageClient.class); 12 13 14 Call<List<ListImage>> call2 = service.listImages(); 15 System.out.println(service.listImages()); 16 17 call2.enqueue(new Callback<List<ListImage>>() { 18 @Override 19 public void onResponse(Call<List<ListImage>> call, Response<List<ListImage>> response) { ★③戻り値がないメソッド 20 List<ListImage> listImage = response.body(); 21 System.out.println(response.body()); 22 int s = listImage.size(); 23 24 25 for(int i = 0; i < s; i++){ 26 Log.d("debug3", listImage.get(i).toString()); 27 System.out.println(listImage.get(i).getEn_title()); 28 lists.add(listImage.get(i).getEn_title()); 29 } 30 31 } 32 33 @Override 34 public void onFailure(Call<List<ListImage>> call, Throwable t) { 35 Log.d("debug4", t.getMessage()); 36 } 37 }); 38 System.out.println("あ"); 39 System.out.println(lists); ★④空になる。 40 System.out.println("い"); 41 return lists; 42 } 43 44}

Retrofit2を使っています。
③のメソッドを戻り値ありに変更できず、結果①で定義した変数に③で取得した配列を格納できず、
②メソッドの戻り値が空になります。

③から②へ値を渡す方法に関してご助言をいただきたいです!

ちなみにフラグメントはこのような形で行ってます。

Java

1~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2 //リストフラグメントの生成(2) 3 public static class TitlesFragment extends ListFragment { 4 private int pos = -1; 5 public HttpConnect hc = new HttpConnect(); 6 7 //アクティビティ生成完了時に呼ばれる(3) 8 @Override 9 public void onActivityCreated(Bundle bundle) { 10 super.onActivityCreated(bundle); 11 setListAdapter(new ArrayAdapter<String>(getActivity(), 12 android.R.layout.simple_list_item_activated_1, 13 (List<String>)hc.showMember())); ★★ 14 getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 15 getListView().setBackgroundColor(Color.LTGRAY); 16 if (isTablet(getActivity())) showDetails(0); 17 } 18~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

よろしくお願いします。

追加

以下の記事のようにonResponseメソッド内でViewに値を設定するのが良いのでしょうか。
ただ、以下のやり方だとフラグメントは使えなさそうな木がするのですが、

Android:Retrofit2.0ではてなAPIとおしゃべりしてみた

それともセッターを作った方がいいんでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

戻り値がvoidのメソッドではどうやっても戻り値を返すことはできません。
そのため③から②に値を渡すという考え方自体が間違っています。

・コールバックインターフェースを自作する。
・フラグメントで上記のインターフェースを実装する。
・HttpConnectに上記のインターフェースをコールバックインターフェースとして設定する。
・onResponseてコールバックメソッドを呼び、フラグメントにlistsを渡す。

また、表示処理が無いのにshowMemberというメソッド名はイマイチですね。

投稿2017/06/02 03:43

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s.k

2017/06/02 06:59

ありがとうございます! 試してみます! コールバックあまり経験ないのでお時間いただきます!
guest

0

Androidでは通信等の思い処理は別スレッドで行わなければなりません。
Retrofitもそれに則っており通信処理は別スレッドで行っています。
今回戻り値が空の配列になってしまうのは、別スレッドで行われている通信処理の完了を待たないでreturnしてしまっているからです。

僕が考え付く解決策としては
・showMemberの戻り値をCallback<List<ListImage>>にしてfragment側で通信結果を受け取ってviewにデータをせっとする
・showMemberの引数にviewを渡して通信が終わったらviewにデータをせっとする
・コールバックインターフェースを作成し、通信結果をfragmentにコールバックする

があります。2番目の方法はメモリリークの可能性があるのであまりおすすめ出来ません。一番簡単なのは1番目の方法だと思います

投稿2017/06/02 04:29

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s.k

2017/06/02 06:54 編集

ありがとうございます! すみません。1番目の方法ですが、 public List<ListImage> showMember(){  〜〜  return Callback<List<ListImage>>;}} こういうことですか?
退会済みユーザー

退会済みユーザー

2017/06/02 07:24

すみません。戻り値ではなく、戻り値の型でした。 public List<ListImage> showMember()→public Callback<List<ListImage>> showMember()へ変更してください
s.k

2017/06/02 08:54

ありがとうございます! 戻り値でエラーが出るので、調整します!
guest

0

お二人の意見を元に解決できました。

かなり強引に行きました。

解決してはいますが、ご意見頂けますと嬉しいです。

Present.javaのフラグメントのリストを表示する処理をメソッド化し、
そのメソッドをコールバック関数内に仕込みました。

実現した流れは以下です。

①JSON配列データリスト表示メソッド起動(Present.java#setListAdapterMethod)
②HTTP通信&JSONデータ取得(HttpConnect.java#passList)
③JSONデータ取得後にコールバック関数の起動(Present.java#callbackMethod)
④コールバック関数内でもう一度配列データリスト表示メソッド起動(Present.java#callbackMethod#setListAdapterMethod)

setListAdapterMethodを新しく作り解決できました。

Before

Java

1 setListAdapter(new ArrayAdapter<String>(getActivity(), 2 android.R.layout.simple_list_item_activated_1, 3 lists)); 4 getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 5 getListView().setBackgroundColor(Color.LTGRAY); 6 if (isTablet(getActivity())) showDetails(0);

After

Java

1 2 public void setListAdapterMethod(List<String> lists){ 3 System.out.println(lists); 4 setListAdapter(new ArrayAdapter<String>(getActivity(), 5 android.R.layout.simple_list_item_activated_1, 6 lists)); 7 getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 8 getListView().setBackgroundColor(Color.LTGRAY); 9 if (isTablet(getActivity())) showDetails(0); 10 }

★以下全コード★

Present.java

Java

1public class Present extends Activity { 2 3 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 4 5 //リストフラグメントの生成(2) 6 public static class TitlesFragment extends ListFragment implements CallHttp.CallHttpCallbacks { 7 8 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 9 10 //アクティビティ生成完了時に呼ばれる(3) 11 @Override 12 public void onActivityCreated(Bundle bundle) { 13 super.onActivityCreated(bundle); 14 15 hc.passList(); 16 System.out.println("あああ"); 17 System.out.println(lists); 18 System.out.println("いいい"); 19 setListAdapterMethod(lists); ★メソッド化★ 20 } 21 22 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 23 24 25 public void callbackMethod(List<String> lists){ 26 System.out.println( "コールバック成功!"); 27 System.out.println(lists); 28 setListAdapterMethod(lists); ★メソッド追加★ 29 } 30 31 32 public void setListAdapterMethod(List<String> lists){ ★メソッド化★ 33 System.out.println(lists); 34 setListAdapter(new ArrayAdapter<String>(getActivity(), 35 android.R.layout.simple_list_item_activated_1, 36 lists)); 37 getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 38 getListView().setBackgroundColor(Color.LTGRAY); 39 if (isTablet(getActivity())) showDetails(0); 40 } 41 } 42 43 44}

投稿2017/06/03 03:45

s.k

総合スコア423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問