2017-12-12 10 views
1

APIからのプロファイルを表示するのにThis libraryを使用しますが、私の問題はbubblePicker.setAdapter() Retrofit呼び出しが終了する前に実行されます。仕上げ後にメソッドを呼び出す方法呼び出しを更新しますか?

enqueue()は非同期メソッドなので、待たずに行を実行していると思います。私はこの問題をどのように解決するか考えていません。

studentsArrayがnullであるため、マイコードでNullPointerExceptionがスローされます。

アドバイスをお願いします。 おかげ

マイコード:

public class FriendFragment extends Fragment { 

    Http http = new Http(); 
    final String BASE_URL = http.getUrl(); 

    String[] studentsArray; 
    List <Student> students; 

    BubblePicker bubblePicker; 


    public static FriendFragment newInstance() { 
     FriendFragment fragment = new FriendFragment(); 
    return fragment; 
    } 

    private ApiService getInterfaceService() { 
     Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl(BASE_URL) 
     .addConverterFactory(GsonConverterFactory.create()) 
     .build(); 
     final ApiService mInterfaceService = retrofit.create(ApiService.class); 
     return mInterfaceService; 
    } 

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

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_friend, container, false); 
     bubblePicker = (BubblePicker) rootView.findViewById(R.id.picker); 
     ApiService mApiService = getInterfaceService(); 
     Call <GetFriendsPhotoDao> mService = mApiService.photo("2", "2202", "2", "1", "1", "2558"); 
     //***** Call API Here ***** 
     mService.enqueue(new Callback <GetFriendsPhotoDao>() { 
      @Override 
      public void onResponse(Call <GetFriendsPhotoDao> call, Response <GetFriendsPhotoDao> response) { 
       GetFriendsPhotoDao getFriendsPhotoDao = response.body(); 
       if (getFriendsPhotoDao.getSuccess()) { 
        students = getFriendsPhotoDao.getStudent(); 
        studentsArray = new String[students.size()]; 
        for (int i = 0; i < studentsArray.length; i++) { 
         studentsArray[i] = students.get(i).getStuId(); 
        } 
       } 
      } 
      @Override 
      public void onFailure(Call <GetFriendsPhotoDao> call, Throwable t) { 
       call.cancel(); 
      } 
     }); 
     addBubble(); 
     return rootView; 
    } 



//***** Add bubbles here ***** 
private void addBubble() { 

    bubblePicker.setBubbleSize(10); 
    bubblePicker.setAdapter(new BubblePickerAdapter() { 
     @Override 
     public int getTotalCount() { 
      return studentsArray.length; 
     } 

     @NotNull 
     @Override 
     public PickerItem getItem(int position) { 
      PickerItem item = new PickerItem(); item.setIcon(getResources().getDrawable(R.drawable.person)); 
      item.setTextColor(ContextCompat.getColor(getContext(), android.R.color.white)); 
      return item; 
     } 
    }); 
    } 

... 
} 
+0

そして、なぜそれが 'onResponse'で呼び出されていないのですか?リクエストが終了した後に呼び出されるのは明らかでしょうか? – tyczj

+0

Github [Here](https://github.com/igalata/Bubble-Picker/issues/29)の報告書である「lateinitプロパティ項目が初期化されていません」というエラーが発生したため – mongkonsrisin

答えて

1

あなたが実際に、あなたはあなたのアダプターとのセットアダプタのインスタンスを応答

mService.enqueue(new Callback <GetFriendsPhotoDao>() { 
      @Override 
      public void onResponse(Call <GetFriendsPhotoDao> call, Response <GetFriendsPhotoDao> response) { 
       GetFriendsPhotoDao getFriendsPhotoDao = response.body(); 
       if (getFriendsPhotoDao.getSuccess()) { 
        students = getFriendsPhotoDao.getStudent(); 
        studentsArray = new String[students.size()]; 
        for (int i = 0; i < studentsArray.length; i++) { 
         studentsArray[i] = students.get(i).getStuId(); 
        } 
       } 
      addBubble(); 
      //^^^^^^^ 
      } 
      @Override 
      public void onFailure(Call <GetFriendsPhotoDao> call, Throwable t) { 
       call.cancel(); 
      } 
     }); 
     //addBubble(); 
+0

ありがとうございました。 'lateinitのプロパティ項目が初期化されていないために値が落ちましたがクラッシュしました'このエラーは[Github](https://github.com/igalata/Bubble-Picker/issues/29)でも報告されています – mongkonsrisin

+0

@mongkonsrisin私は嬉しいですそれはバグのように思えるが助けることができる:( –

0

を作成していたらあなたは、onResponse内部からaddBubble();を移動する必要がありますWebサービスの外部では、アダプタにデータが設定されていないため、onResponseメソッドをオーバーライドしてください。これを試してください。

public class FriendFragment extends Fragment { 

    Http http = new Http(); 
    final String BASE_URL = http.getUrl(); 

    String[] studentsArray; 
    List <Student> students; 

    BubblePicker bubblePicker; 


    public static FriendFragment newInstance() { 
     FriendFragment fragment = new FriendFragment(); 
    return fragment; 
    } 

    private ApiService getInterfaceService() { 
     Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl(BASE_URL) 
     .addConverterFactory(GsonConverterFactory.create()) 
     .build(); 
     final ApiService mInterfaceService = retrofit.create(ApiService.class); 
     return mInterfaceService; 
    } 

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

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_friend, container, false); 
     bubblePicker = (BubblePicker) rootView.findViewById(R.id.picker); 
     ApiService mApiService = getInterfaceService(); 
     Call <GetFriendsPhotoDao> mService = mApiService.photo("2", "2202", "2", "1", "1", "2558"); 
     //***** Call API Here ***** 
     mService.enqueue(new Callback <GetFriendsPhotoDao>() { 
      @Override 
      public void onResponse(Call <GetFriendsPhotoDao> call, Response <GetFriendsPhotoDao> response) { 
       GetFriendsPhotoDao getFriendsPhotoDao = response.body(); 
       if (getFriendsPhotoDao.getSuccess()) { 
        students = getFriendsPhotoDao.getStudent(); 
        studentsArray = new String[students.size()]; 
        for (int i = 0; i < studentsArray.length; i++) { 
         studentsArray[i] = students.get(i).getStuId(); 
        } 
        addBubble(); 
       } 
      } 
      @Override 
      public void onFailure(Call <GetFriendsPhotoDao> call, Throwable t) { 
       call.cancel(); 
      } 
     }); 
     //addBubble(); 
     return rootView; 
    } 



//***** Add bubbles here ***** 
private void addBubble() { 

    bubblePicker.setBubbleSize(10); 
    bubblePicker.setAdapter(new BubblePickerAdapter() { 
     @Override 
     public int getTotalCount() { 
      return studentsArray.length; 
     } 

     @NotNull 
     @Override 
     public PickerItem getItem(int position) { 
      PickerItem item = new PickerItem(); item.setIcon(getResources().getDrawable(R.drawable.person)); 
      item.setTextColor(ContextCompat.getColor(getContext(), android.R.color.white)); 
      return item; 
     } 
    }); 
    } 

... 
} 
関連する問題