vikas bajpai
vikas bajpai

Reputation: 1

Multiprocessing or Multithreading using rxjava2+retrofit is not working

This is my Code:-[output which i am getting is showing in image below.][1] mainfile code

But i want output like showing github repos of two users in one screen and vikashumain(username) repos on left side and naman14(username) repos on right side.but i am getting only one user repos showing on both sides like vikashumain user showing only on both sides

BASE_URL=https://api.github.com/

/**
 * A simple {@link Fragment} subclass.
 */
public class BlankFragment extends Fragment {


    public BlankFragment() {
        // Required empty public constructor
    }

    @BindView(R.id.re1)
    RecyclerView recyclerView;
    @BindView(R.id.re2)
    RecyclerView recyclerView2;

    View v;
    List<MainCategoryData> list,list2;
    private RepoAdapter adapter;
    Retrofit retrofit;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        v= inflater.inflate(R.layout.fragment_blank, container, false);
        ButterKnife.bind(this,v);
        recyclerView.setHasFixedSize(true);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
        recyclerView.setLayoutManager(layoutManager);
        recyclerView2.setHasFixedSize(true);
        RecyclerView.LayoutManager layoutManager2 = new LinearLayoutManager(getContext());
        recyclerView2.setLayoutManager(layoutManager2);
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        retrofit.create(ApiServiceMain.class).maincategorya()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(this::handleRespons, this:: handleError);
        Observable.just(retrofit.create(ApiServiceMain.class)).subscribeOn(Schedulers.computation())
                .flatMap(s -> {
                    Observable<List<MainCategoryData>> couponsObservable
                            = s.maincategorya().subscribeOn(Schedulers.io());

                    Observable<List<MainCategoryData>> storeInfoObservable
                            = s.maincategoryap().subscribeOn(Schedulers.io());

                    return Observable.merge(couponsObservable,storeInfoObservable);
                }).observeOn(AndroidSchedulers.mainThread()).subscribe(this::handleRespons, this::handleError );

        return v;
    }




    private void handleRespons(List<MainCategoryData> storeCoupons) {
        list = new ArrayList<>(storeCoupons);
        adapter = new RepoAdapter(list);
        recyclerView.setAdapter(adapter);
        list2 = new ArrayList<>(storeCoupons);//error
        adapter = new RepoAdapter(list2);
        recyclerView2.setAdapter(adapter);


    }
    public void handleError(Throwable error) {
        Toast.makeText(getContext(), "Error "+error.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
    }
    }

This is my service file:-ApiService.java

public interface ApiServiceMain
{
//we used post here becz here we have parameters .Get and Post works in the same way but post has parameters and get doesn't have.
    @GET("users/vikashumain/starred")
    Observable<List<MainCategoryData>> maincategoryapi();

    @GET("users/naman14/starred")
    Observable<List<MainCategoryData>> maincategoryap();

    @GET("users/vikashumain/starred")
    Observable<List<MainCategoryData>> maincategorya();



}

Model(POJO) class:-

public class MainCategoryData {

    public  int id;
    public  String name;
    private String html_url;
    public  String description;
    public  String language;
    public  int stargazers_count;

    public MainCategoryData() {

    }

    public int getId() {
        return id;
    }
    List<Vikashumain> data2;
    public String getName() {
        return name;
    }

    public List<Vikashumain> getData2() {
        return data2;
    }

    public void setData2(List<Vikashumain> data2) {
        this.data2 = data2;
    }

    public void setId(int id) {
        this.id = id;

    }

    public void setName(String name) {
        this.name = name;
    }

    public void setHtmlUrl(String html_url) {
        this.html_url = html_url;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public void setLanguage(String language) {
        this.language = language;
    }

    public void setStargazersCount(int stargazers_count) {
        this.stargazers_count = stargazers_count;
    }

    public String getHtmlUrl() {
        return html_url;
    }

    public String getDescription() {
        return description;
    }

    public String getLanguage() {
        return language;
    }

    public int getStargazersCount() {
        return stargazers_count;
    }
    public MainCategoryData(int id, String name, String html_url, String description, String language, int stargazers_count) {
        this.id = id;
        this.name = name;
        this.html_url = html_url;
        this.description = description;
        this.language = language;
        this.stargazers_count = stargazers_count;
    }
}

https://i.sstatic.net/sga9A.jpg

json file which i am parsing:-https://api.github.com/users/vikashumain/starred second json file which i am parsing:-https://api.github.com/users/naman14/starred

Upvotes: 0

Views: 173

Answers (1)

akarnokd
akarnokd

Reputation: 69997

It's not clear what you try to achieve here. You merge the two users' data into one list and set the same list on both views.

This will update both panels to the same list because of handleRespons:

retrofit.create(ApiServiceMain.class).maincategorya()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(this::handleRespons, this::handleError);

Sometime after this, the following call will produce 2 lists, one for each user and the handleRespons gets invoked twice. The slower user's data will again overwrite both panels data.

Observable.just(retrofit.create(ApiServiceMain.class))
          .subscribeOn(Schedulers.computation())
          .flatMap(s -> {
              Observable<List<MainCategoryData>> couponsObservable
                        = s.maincategorya().subscribeOn(Schedulers.io());

              Observable<List<MainCategoryData>> storeInfoObservable
                        = s.maincategoryap().subscribeOn(Schedulers.io());

              return Observable.merge(couponsObservable,storeInfoObservable);
          })
          .observeOn(AndroidSchedulers.mainThread())
          .subscribe(this::handleRespons, this::handleError);

You should probably implement two separate response handlers unique to each panel:

private void handleResponseLeft(List<MainCategoryData> storeCoupons) {
    List<MainCategoryData> list = new ArrayList<>(storeCoupons);
    RepoAdapter adapter = new RepoAdapter(list);
    recyclerView.setAdapter(adapter);
}

private void handleResponseRight(List<MainCategoryData> storeCoupons) {
    List<MainCategoryData> list2 = new ArrayList<>(storeCoupons);
    RepoAdapter adapter2 = new RepoAdapter(list2);
    recyclerView2.setAdapter(adapter2);
}

ApiServiceMain s = retrofit.create(ApiServiceMain.class);

s.maincategorya()
 .subscribeOn(Schedulers.io())
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(this::handleResponseLeft, this::handleError);

s.maincategoryap()
 .subscribeOn(Schedulers.io())
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(this::handleResponseRight, this::handleError);

Upvotes: 1

Related Questions