konmik / nucleus

Nucleus is an Android library, which utilizes the Model-View-Presenter pattern to properly connect background tasks with visual parts of an application.
MIT License
1.98k stars 253 forks source link

Activity method called every time #139

Closed mistrydarshan99 closed 7 years ago

mistrydarshan99 commented 7 years ago

Hello,

I have used this library in my project. I have two Activities consider Activity_A and Activity_B.

Issue Steps : 1) In Activity_A click on button webservice is called after validating data i have to start Activity_B 2) User from Activity_B click on back button for going to Activity_A 3) Now the issue is in Activity_A without click button i got webservice data and user is automatic move on Activity_B.... In below example updateUi method in ScreenConfigActivity is called when i am coming back from MainActivity

So how can i prevent this issue.

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import com.my_mvp.R;
import com.my_mvp.base.BaseActivity;
import com.my_mvp.bean.SampleResponse;
import com.my_mvp.presenter.ScreenOrientationPresenter;
import nucleus5.factory.RequiresPresenter;

@RequiresPresenter(ScreenOrientationPresenter.class) public class ScreenConfigActivity
    extends BaseActivity<ScreenOrientationPresenter> {

  private static final String TAG = ScreenConfigActivity.class.getSimpleName();
  private TextView tvDemo;

  @Override protected void loadData(Bundle savedInstanceState) {

  }

  @Override protected void initViews() {
    tvDemo = (TextView) findViewById(R.id.tvDemo);
    tvDemo.setOnClickListener(v -> {
      showProgress("Please wait...");
      getPresenter().request(ScreenOrientationPresenter.NAME_1);
    });
  }

  @Override protected int getContentView() {
    return R.layout.activity_screen_config;
  }

//TODO this method is called when i am coming back from MainActivity, 
Expected result when i click on tvDemo then webservice is called and after that this method is called 
  public void updateUi(SampleResponse sampleResponse) {
    dismissProgress();
    Log.e(TAG, "updateUi: -------------------->" + sampleResponse.getItems().size());
    Intent intent = new Intent(this, MainActivity.class);
    startActivity(intent);
  }

  @Override protected void onPause() {
    super.onPause();
  }
}
import android.os.Bundle;
import android.util.Log;
import com.my_mvp.activity.ScreenConfigActivity;
import com.my_mvp.base.BasePresenter;
import com.my_mvp.network.RetrofitSingleton;
import icepick.State;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;

/**
 * Created by darshan.mistry on 3/24/2017.
 */

public class ScreenOrientationPresenter extends BasePresenter<ScreenConfigActivity> {

  private static final int REQUEST_ITEMS = 1;
  private static final String TAG = "";
  @State public String name;
  public static final String NAME_1 = "Chuck Norris";
  public static final String NAME_2 = "Jackie Chan";
  public static final String DEFAULT_NAME = NAME_1;

  //TODO is called on every presenter’s creation.
  @Override protected void onCreate(Bundle savedState) {
    super.onCreate(savedState);

    //.getItems(name.split("\\s+")[0], name.split("\\s+")[1])

    if (savedState == null) {
      restartableLatestCache(REQUEST_ITEMS, () -> {
            return RetrofitSingleton.getInstance()
                .configRetrofit()
                .getItems(name.split("\\s+")[0], name.split("\\s+")[1])
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread());
          }, (screenConfigActivity, sampleResponse) -> screenConfigActivity.updateUi(sampleResponse),
          (screenConfigActivity, throwable) -> Log.e(TAG, "onCreate: "));
    }
  }

  public void request(String name) {
    this.name = name;
    start(REQUEST_ITEMS);
  }

import android.os.Bundle;
import android.widget.TextView;
import com.my_mvp.R;
import com.my_mvp.base.BaseActivity;
import com.my_mvp.presenter.MainPresenter;
import nucleus5.factory.RequiresPresenter;

@RequiresPresenter(MainPresenter.class) public class MainActivity
    extends BaseActivity<MainPresenter> {

  private TextView tvText;

  @Override protected void loadData(Bundle savedInstanceState) {
  }

  @Override protected void initViews() {
    tvText = (TextView) findViewById(R.id.tvText);
  }

  @Override protected int getContentView() {
    return R.layout.activity_main;
  }

  public void updateUi(String text) {
    tvText.setText(text);
  }
}
konmik commented 7 years ago

HI, if I understood your issue properly, this is by design. Presenter just pushes all event on resume. Try restartableFirst.

sw-tt-darshanmistry commented 7 years ago

Thanks, issue has been resolved using restartableFirst.