2016-07-07 18 views
1

Ich entwickle eine Android-App, die Google Cloud-Endpunkte als Backend verwendet. Das Backend funktioniert und kann vom Android Client aufgerufen werden.Warum ist mSuggestedFriends null?

In der FindFriendFragment ich eine Endpunkte Async-Task-Klasse aufrufen;

new EndpointTask.GetSuggestedFriends(mUserId, getContext()); 

, die die vorgeschlagenen Freunde aus dem Datenspeicher über den freigelegten Endpunkte api holt und sendet sie zurück an den Client;

return mApi.getSuggestedFriends().execute().getItems(); 

In der On-Post-Ausführung verwende ich eine Schnittstelle;

public interface OnFetchedSuggestedFriends { 
    void sendSuggestedFriends(List<Profile> suggestedFriends); 
} 

@Override 
protected void onPostExecute(List<Profile> profiles) { 
    super.onPostExecute(profiles); 
    OnFetchedSuggestedFriends callback = (OnFetchedSuggestedFriends) mContext; 
    callback.sendSuggestedFriends(profiles); 
} 

, die die FindFriendFragment implementiert die vorgeschlagenen Freunde an das Fragment verwendet werden, zurück zu senden;

public class FindFriendFragment extends Fragment 
     implements EndpointTask.GetSuggestedFriends.OnFetchedSuggestedFriends 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.fragment_find_friend, container, false); 

     mAuth = FirebaseAuth.getInstance(); 
     FirebaseUser user = mAuth.getCurrentUser(); 
     if (user != null) 
      mUserId = user.getToken(true).toString(); 

     new EndpointTask.GetSuggestedFriends(mUserId, getContext()); 

     RecyclerView suggestedFriendRecyclerView = (RecyclerView) view.findViewById(R.id.suggested_friends_recycler_view); 
     suggestedFriendRecyclerView.setHasFixedSize(true); 
     LinearLayoutManager mLayoutManager = new LinearLayoutManager(getContext()); 
     mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
     suggestedFriendRecyclerView.setLayoutManager(mLayoutManager); 

     SuggestedFriendAdapter adapter = new SuggestedFriendAdapter(mSuggestedFriends, mUserId); 
     suggestedFriendRecyclerView.setAdapter(adapter); 
     return view; 
    } 

    @Override 
    public void sendSuggestedFriends(List<Profile> suggestedFriends) { 
     mSuggestedFriends = suggestedFriends; 
    } 

jedoch die vorgeschlagene Freunde Feld null ist, obwohl, wenn ich meine Back-End mit dem api Explorer testen die getSuggestedFriends Verfahren die suggestedFriends kehrt wie erwartet. Ist das aufgrund des api Anrufs sehr zeitaufwendig?

EDIT:

Hier ist die async Aufgabe Code:

public static class GetSuggestedFriends extends AsyncTask<Void, Void, List<Profile>>{ 

     private BirthpayApi mApi; 
     private String mUserId; 
     private OnFetchedSuggestedFriends mListener; 

     public GetSuggestedFriends(String userId, OnFetchedSuggestedFriends listener) { 
      mUserId = userId; 
      mListener = listener; 
     } 

     public interface OnFetchedSuggestedFriends { 
      void sendSuggestedFriends(List<Profile> suggestedFriends); 
     } 

     @Override 
     protected List<Profile> doInBackground(Void... params) { 
      if (mApi == null) { 
       BirthpayApi.Builder builder = new BirthpayApi.Builder(AndroidHttp.newCompatibleTransport(), 
         new AndroidJsonFactory(), null) 
         // options for running against local devappserver 
         // - 10.0.2.2 is localhost's IP address in Android emulator 
         // - turn off compression when running against local devappserver 
         .setRootUrl("http://10.0.2.2:8080/_ah/api/") 
         .setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() { 
          @Override 
          public void initialize(AbstractGoogleClientRequest<?> abstractGoogleClientRequest) throws IOException { 
           abstractGoogleClientRequest.setDisableGZipContent(true); 
          } 
         }); 
       mApi = builder.build(); 
      } 

      try{ 
       return mApi.getSuggestedFriends().execute().getItems(); 
      } catch(IOException e) { 
       e.printStackTrace(); 
       return null; 
      } 
     } 

     @Override 
     protected void onPostExecute(List<Profile> profiles) { 
      super.onPostExecute(profiles); 
      mListener.sendSuggestedFriends(profiles); 
     } 
    } 
+0

posten Sie bitte Ihren asynctask Code – Hardy

+1

Es ist fertig. @Hardy –

+0

Überprüfen Sie meine letzte Zeile aktualisiert und jetzt, wenn es nicht funktioniert, können wir es erneut versuchen :) @Tom Finet – Hardy

Antwort

1

Hallo Sie Benachrichtigung nicht Ihren Adapter prüfen, ob unter Code funktioniert: ----

public class FindFriendFragment extends Fragment 
    implements EndpointTask.GetSuggestedFriends.OnFetchedSuggestedFriends 
SuggestedFriendAdapter adapter; 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_find_friend, container, false); 

    mAuth = FirebaseAuth.getInstance(); 
    FirebaseUser user = mAuth.getCurrentUser(); 
    if (user != null) 
     mUserId = user.getToken(true).toString(); 

    new EndpointTask.GetSuggestedFriends(mUserId, getContext()); 

    RecyclerView suggestedFriendRecyclerView = (RecyclerView) view.findViewById(R.id.suggested_friends_recycler_view); 
    suggestedFriendRecyclerView.setHasFixedSize(true); 
    LinearLayoutManager mLayoutManager = new LinearLayoutManager(getContext()); 
    mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    suggestedFriendRecyclerView.setLayoutManager(mLayoutManager); 

    adapter = new SuggestedFriendAdapter(mSuggestedFriends, mUserId); 
    suggestedFriendRecyclerView.setAdapter(adapter); 
    return view; 
} 

@Override 
public void sendSuggestedFriends(List<Profile> suggestedFriends) { 
    mSuggestedFriends = suggestedFriends; 
adapter.notifyDatasetChanged(); 
} 
  • getContext() * Überprüfen Sie hier Ihre cont ext implementiert Ihre Schnittstelle oder nicht !!!

Einsatz unter Leitung statt: -

new EndpointTask.GetSuggestedFriends(mUserId, FindFriendFragment.this); 

** Im Folgenden neuen Codezeile fr Ihre benötigten Kontext **

new EndpointTask.GetSuggestedFriends(mUserId, getActivity(),FindFriendFragment.this); 

Ihre AsyncTask Paramter sein sollte !!!

EndpointTask.GetSuggestedFriends.OnFetchedSuggestedFriends listener; 

und definieren Sie es in Ihrem Konstruktor wie ....

GetSuggestedFriends(mUserId, getActivity(), 

    EndpointTask.GetSuggestedFriends.OnFetchedSuggestedFriends listener_) 
{ 
    listener=listener_} 

Ihr auf Beitrag wird wie folgt aussehen ...

@Override 
protected void onPostExecute(List<Profile> profiles) { 
    super.onPostExecute(profiles); 
    listener.sendSuggestedFriends(profiles); 
} 

:) letzte Prüfung Linie: -

new EndpointTask.GetSuggestedFriends(mUserId, getActivity(),FindFriendFragment.this).execute(); 
+0

Dies scheint nicht zu funktionieren, das Fragment ist immer noch leer wegen mSuggestedFriends == null; –

+0

Drucken LOG in sendSuggestedFriends-Methode Was bekommen Sie? @TomFinet – Hardy

+0

Sie wollen, dass ich Log.i() das suggestFriends-Feld? @Hardy –