模型视图Presenter与AA和Retrofit,而不是获取数据

时间:2017-05-31 21:30:41

标签: android retrofit2 android-annotations

我试图使用AndroidAnnotations和Retrofit2在Android中做一个简单的MVP, 但我从来没有得到这些信息。

代码演示者

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

}

代码活动

@EActivity(R.layout.activity_home)

public class HomeActivity扩展了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){

    }
}

}

但是,我得到了空数据。

帮助我!

2 个答案:

答案 0 :(得分:1)

你的getPost方法有一个竞争条件,当返回mPost时,回调还没有返回响应。

我建议getPost方法不返回任何内容,一旦传递onResponse,就会调用一个填充适配器的视图方法。

这可确保您始终拥有数据。

答案 1 :(得分:1)

这是一个例子:

主讲人:

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

}

的活动:

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

只有你需要实现一个接口视图来在两个类之间进行交互