2017-05-31 42 views
0

我试图在Android中使用AndroidAnnotations和Retrofit2, 做一个简单的MVP但我从来没有得到的信息。模型视图演示者与AA和改造,而不是获取数据

代码演示

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) 

公共类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){ 

    } 
} 

}

但是,我得到空数据。

帮帮我!

回答

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

只有你需要实现一个接口以两个类之间的交互

+1

你可以看到这个例子来阐明[Android MVP](https://github.com/antoniolg/androidmvp)的概念 –

+0

如何使用我的界面方法演示者功能?我实例化,但得到错误 –

+1

在演示器构造器中设置视图界面 –

1

您的getPost方法有竞争条件,当返回mPost时,回调尚未返回响应。

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

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

+0

你需要有一个如MVP模式中定义的那样在当前和活动之间进行交互。 –

+0

非常感谢! –

+0

我通过RecyclerView和上下文作为参数来填充它。没关系?我刚刚开始在MVP –

相关问题