2017-05-31 1 views
0

Je tente de faire un simple MVP dans Android en utilisant AndroidAnnotations et Retrofit2, Mais je ne reçois jamais l'information.Modèle Présentateur avec AA et Retrofit, ne pas obtenir de données

code Présentateur:

public class ListHomePresenter { 


private List<Post> mPost; 
Client client; 
int error_code = 0; 
String error_msg = ""; 

/** 
* TODO: get all post 
* */ 
public List<Post> getPost() throws SampleExceptions{ 
    RestService restService; 
    client = new Client(); 
    restService = client.getApi(); 

    Call<List<Post>> task = restService.downloadPost(); 

    task.enqueue(new Callback<List<Post>>() { 
     @Override 
     public void onResponse(Call<List<Post>> call, Response<List<Post>> response) { 
      mPost = response.body(); 
     } 

     @Override 
     public void onFailure(Call<List<Post>> call, Throwable t) { 
      mPost = null; 

      error_code = 1; // error 
      error_msg = t.getMessage(); // message 
     } 
    }); 

    if(error_code == 1) 
     throw new SampleExceptions(error_code, "Error"); 

    return mPost; 
} 

}

code Activité

@EActivity(R.layout.activity_home) 

HomeActivity public class étend AppCompatActivity {

@ViewById(R.id.rvPosts) 
RecyclerView mRvPost; 

PostAdapter mPostAdapter; 

ListHomePresenter mListHomePresenter; 

private StaggeredGridLayoutManager gaggeredGridLayoutManager; 

@AfterViews 
void setupHome(){ 
    downloadPost(); 
} 


@UiThread(propagation = Propagation.REUSE) 
void downloadPost(){ 
    try{ 
     mListHomePresenter = new ListHomePresenter(); 
     gaggeredGridLayoutManager = new StaggeredGridLayoutManager(2, 1); 
     mRvPost.setLayoutManager(gaggeredGridLayoutManager); 
     mPostAdapter = new PostAdapter(HomeActivity.this, mListHomePresenter.getPost()); 
     mRvPost.setAdapter(mPostAdapter); 

    }catch (SampleExceptions e){ 

    } 
} 

}

mais, jamais j'obtiens les données nulles.

Aidez-moi!

Répondre

1

Voici un exemple:

Présentateur:

public class ListHomePresenter { 

     private List<Post> mPost; 
     Client client; 
     int error_code = 0; 
     String error_msg = ""; 
     HomeView view; 

     public ListHomePresenter(HomeView view) { 
      this.view = view; 
     } 

     /** 
     * TODO: get all post 
     * */ 
     public void loadPost() throws SampleExceptions{ 
      RestService restService; 
      client = new Client(); 
      restService = client.getApi(); 

      Call<List<Post>> task = restService.downloadPost(); 

      task.enqueue(new Callback<List<Post>>() { 
       @Override 
       public void onResponse(Call<List<Post>> call, Response<List<Post>> response) { 
        view.retrieveData(response.body()); 
       } 

       @Override 
       public void onFailure(Call<List<Post>> call, Throwable t) { 
        mPost = null; 

        error_code = 1; // error 
        error_msg = t.getMessage(); // message 
       } 
      }); 

      if(error_code == 1) 
       throw new SampleExceptions(error_code, "Error"); 
     } 

} 

Activité:

@ViewById(R.id.rvPosts) 
RecyclerView mRvPost; 

PostAdapter mPostAdapter; 

ListHomePresenter mListHomePresenter; 

private StaggeredGridLayoutManager gaggeredGridLayoutManager; 

@AfterViews 
void setupHome() { 
    downloadPost(); 
} 


@UiThread(propagation = Propagation.REUSE) 
void downloadPost() { 
    try { 
     mListHomePresenter = new ListHomePresenter(this); 
     mListHomePresenter.loadPost() 
    } catch (SampleExceptions e) { 

    } 
} 

// Method implemented from view interface 
@Override 
void retrieveData(List<Post> postList) { 
    gaggeredGridLayoutManager = new StaggeredGridLayoutManager(2, 1); 
    mRvPost.setLayoutManager(gaggeredGridLayoutManager); 
    mPostAdapter = new PostAdapter(HomeActivity.this, postList); 
    mRvPost.setAdapter(mPostAdapter); 
} 

Seulement vous faut mettre en œuvre une vue d'interface interagit entre deux classes

+1

Vous pouvez voir cet exemple pour clarifier les concepts [Android MVP] (https://github.com/antoniolg/androidmvp) –

+0

Comment utiliser la méthode d'interface dans mon fonction de présentateur? je suis instancié, mais obtenir l'erreur –

+1

Définir l'interface d'affichage dans le constructeur du présentateur –

1

Vous avez une condition de concurrence sur votre méthode getPost, lorsque return mPost, le rappel n'a pas encore retourné la réponse.

Je recommande que la méthode getPost ne renvoie rien, et une fois que vous passez onResponse, vous appelez une méthode d'affichage qui remplit l'adaptateur.

Cela garantit que vous aurez toujours des données.

+0

Vous devez avoir un interface qui interagit entre le présent et l'activité, comme défini dans le modèle MVP. –

+0

Merci beaucoup !! –

+0

J'ai passé le RecyclerView et le contexte en tant que paramètres pour le remplir. Ça va? Je commence juste à MVP –