首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >调用Rx可观察方法的正确方法是什么?

调用Rx可观察方法的正确方法是什么?
EN

Stack Overflow用户
提问于 2015-10-19 09:46:50
回答 2查看 1.1K关注 0票数 0

我在Wrapper类中定义了一个用于进行Rest调用的以下方法。

代码语言:javascript
运行
AI代码解释
复制
public void getWarehouse(){

    //Generation of  RestAdapter
    RestAdapter adapter = new  RestAdapter.Builder ()
            .setEndpoint(URL)
            .setLogLevel(RestAdapter.LogLevel.FULL)
            .build();

    //Making request to API
    adapter.create(WarehouseAPI.class).getWarehouse()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<List<Warehouse>>() {
                @Override
                public void onCompleted() {
                    Log.d(this.getClass().getName(), "OnCompleted()");
                }

                @Override
                public void onError(Throwable e) {
                    Log.d(this.getClass().getName(), "Error: "  + e.toString());
                }

                @Override
                public void onNext(List<Warehouse> response) {
                }
            });
}

上面的代码运行良好,我得到了预期的响应。但是我需要从一个Adapter class调用这个方法。我怎么能这么做?有什么方法可以使用onNext方法吗?

我是Android rx-javaRetrofit的初学者。

编辑-1

我使用staggeredGridView来显示数据。因此,在我的MainActivity类中,我调用以下代码:

代码语言:javascript
运行
AI代码解释
复制
 StaggeredGridAdapter adapter = new StaggeredGridAdapter(this);
 mRecyclerView.setAdapter(adapter);

要填充StaggeredGridView holder中的数据,我必须调用getWarehouse方法。

编辑-2

主MainActivity的onCreate()方法:

代码语言:javascript
运行
AI代码解释
复制
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mToolbar = (Toolbar) findViewById(R.id.toolbar);
    getWarehouse();
    mRecyclerView = (RecyclerView) findViewById(R.id.staggering_grid);
    mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));

    StaggeredGridAdapter adapter = new StaggeredGridAdapter(this);
    mRecyclerView.setAdapter(adapter);
    GridItemSpaces decoration = new GridItemSpaces(10);
    mRecyclerView.addItemDecoration(decoration);

}

其中StaggeredGridAdapter是:

代码语言:javascript
运行
AI代码解释
复制
public class StaggeredGridAdapter extends RecyclerView.Adapter<StaggeredGridAdapter.StaggeredGridView>{}

编辑-3

建议之后,我在MainActivity.onCreate方法中调用MainActivity.onCreate,并将getWarehouse()的定义复制到MainActivity.class

也是我的MainActivity.getWarehouse.onNext方法:

代码语言:javascript
运行
AI代码解释
复制
@Override
public void onNext(List<Warehouse> response) {
  mAdapter.addItems(response);
}

其中mAdapterprivate StaggeredGridAdapter mAdapter;,稍后在MainActivity.onCreate方法中初始化。

addItems方法在StaggeredGridAdapter类中的定义是什么?

编辑-4

StaggeredGridAdapter的全定义

代码语言:javascript
运行
AI代码解释
复制
public class StaggeredGridAdapter extends RecyclerView.Adapter<StaggeredGridAdapter.StaggeredGridView> {
private Context context;
private List<Warehouse> warehouses = new ArrayList<Warehouse>();
int size;

public StaggeredGridAdapter(Context context) {
    this.context = context;
}

public void addItems(List<Warehouse> response){
    size = response.size();
    warehouses = response;
}

@Override
public StaggeredGridView onCreateViewHolder(ViewGroup parent, int viewType) {
    View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.grid_item, parent, false);
    StaggeredGridView staggeredGridView = new StaggeredGridView(layoutView);
    return staggeredGridView;
}

@Override
public void onBindViewHolder(StaggeredGridView holder, int position) {
    holder.textView.setText(warehouses.get(position).getFace());
}

@Override
public int getItemCount() {
    return size;
}

class StaggeredGridView extends RecyclerView.ViewHolder {
    TextView textView;

    public StaggeredGridView(View itemView) {
        super(itemView);

        textView = (TextView) itemView.findViewById(R.id.img_name);

    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-19 10:34:54

我会把getWarehouse()留在Activity里。在相同的活动中,可以保持对StaggeredGridAdapter的引用,就像对mRecyclerView的引用一样。在适配器中创建一个public void addItems(List<Warehouse> response),当调用onNext时,只需执行mAdapter.addItems(response)

例如。

代码语言:javascript
运行
AI代码解释
复制
 public void addItems(List<Warehouse> items) {
     int oldSize = mDataSet.size();
     synchronized(mDataSet) {
         mDataSet.addAll(items);
     }
     notifyItemRangeInserted(oldSize - 1, mDataSet.size() - 1);
 }

假设mDataSet是您在适配器( dataset)中使用的Collection的名称。

我也会避免实例化

代码语言:javascript
运行
AI代码解释
复制
   RestAdapter adapter = new  RestAdapter.Builder ()
            .setEndpoint(URL)
            .setLogLevel(RestAdapter.LogLevel.FULL)
            .build();

每次你打电话给getWarehouse();subscribe返回一个Subscription对象。保持它为成员变量,并在您的ondDestroy中调用取消订阅

代码语言:javascript
运行
AI代码解释
复制
@Override
protected void onDestroy() {
    super.onDestroy();
    if (mSubscription != null) {
        mSubscription.unsubscribe();
    }
}
票数 0
EN

Stack Overflow用户

发布于 2015-10-19 09:53:47

与其在getWarehouse方法中订阅,不如让getWarehouse返回可观察性并在适配器中执行订阅部分。这样,您就可以让onNext回调存在于适配器中,而不是在调用方法中。理想情况下,您应该只实例化well适配器一次,而不是每次都在getWarehouse方法中实例化。

代码语言:javascript
运行
AI代码解释
复制
public Observable<Warehouse> getWarehouse(){

adapter.getWarehouse()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread());

}

从适配器执行以下操作:someClass.getWarehouse().subscribe(new Subscriber()....)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33220742

复制
相关文章

相似问题

添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文