2016-07-08 26 views
0

匿名の内部クラスメソッドを使用して、外部クラスの 'ArrayList'を作成するにはどうすればよいですか?私のコードは次のとおりです:匿名クラス内の外部クラスプロパティを変更する

public class Bookshelf { 

    private static final String TAG = "Bookshelf"; 
    private final ArrayList<Book> books = new ArrayList<Book>(); 

    public Bookshelf() { 
     try { 
      setContent(); 
     } catch(JSONException e) { 
      Log.i(TAG, e.getMessage()); 
     } 
     Log.i(TAG, Integer.toString(books.size())); //outputs "0" (incorrect) 
    } 

    private void setContent() throws JSONException { 
     RestClient.get("/books/", null, new JsonHttpResponseHandler() { 
      @Override 
      public void onSuccess(int statusCode, Header[] headers, JSONArray response) { 
       super.onSuccess(statusCode, headers, response); 

       for(int i = 0; i < response.length(); i++) { 
        try { 
         JSONObject obj = response.getJSONObject(i); 

         Book book = new Book(); 
         book.setId(obj.getInt("_id")); 
         book.setTitle(obj.getString("name")); 

         books.add(book); 
        } catch (JSONException e) { 
         System.exit(1); 
        } 
       } 
       Log.i(TAG, Integer.toString(books.size())); //outputs 60 (correct) 
      } 

      @Override 
      public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) { 
       super.onFailure(statusCode, headers, responseString, throwable); 
       System.exit(1); 
      } 
     }); 
    } 
} 

APIコールは完全に動作しており、 'ArrayList'は内部クラス内に正しく設定されています。しかし、内部クラスの外にある 'ArrayList'を使って何かをしようとすると、空に戻っていることがわかります。誰かが私を正しい方向に向けることができますか?前もって感謝します!

+0

JsonHttpResponseHandlerはGuavaの将来のようです。何らかの未来がある場合は、将来の完了と外部クラスの内容のチェックの間に競争があるため、おそらくブロックする必要があります。 –

+1

もしそれがandroid-async-http JsonHttpResponseHandlerならば、あなたは未来のものにマップするか、コールバックで設定した 'setContent'の' CountDownLatch'を持っていて、 'setContent'の前に' await'戻る。 –

+0

try: 'books.add(新しいブック());' 'books.get(i).setId(obj.getInt(" _ id "));' 'books.get(i).setTitle(obj .getString( "name")); ' –

答えて

1

私はあなたのプログラムの実行フローを完全に理解していないと思います。
使用しているライブラリはあまり明確ではありませんが、RestClient.get()が非同期要求の要求を出しているようです。つまり、応答を待たずにメインスレッドの実行をブロックしません。通常、いくつかの要求オブジェクトを構築し、その実行を別のスレッドに送信します。そのため、あなたはJsonHttpResponseHandlerの実装を提供する必要があります。応答が準備されているときにいつでも対応する責任があります。
ArrayListが「空に戻っていません」。は、印刷時にはです。
ところで、コンストラクタはそのようなロジックには適していません。私は別のサービスクラスに移動して、それを作成してBookshelfオブジェクトを作成することにしました。

+0

Gotcha!本当にありがとう! –

関連する問題