Miller Mosquera
Miller Mosquera

Reputation: 119

Model View Presenter with AA and Retrofit, not get data

i triying to do a simple MVP in Android using AndroidAnnotations and Retrofit2, But I never get the information.

Code Presenter:

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 Activity

@EActivity(R.layout.activity_home)

public class HomeActivity extends 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){

    }
}

}

but, ever i getting the null data.

Help Me!

Upvotes: 0

Views: 214

Answers (2)

Daniel RL
Daniel RL

Reputation: 353

Here an example:

Presenter:

    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");
        }

}

Activity:

@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);
}

Only you needs implement an interface view to interacts between two classes

Upvotes: 1

Daniel RL
Daniel RL

Reputation: 353

You have a race condition on your getPost method, when return mPost, the callback has not yet returned the response.

I recommend that the getPost method does not return anything, and once you pass onResponse, you call a view method that fills the adapter.

This ensures that you will always have data.

Upvotes: 1

Related Questions