Как исправить: onResume вызывается как до, так и после onActivityResult, когда завершается начатое действие - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь вызвать действие, используя

startActivityForResult()

из фрагмента. Эта деятельность в основном что-то делает, а затем возвращает результат, но что действительно странно, так это то, что после завершения вызываемой операции фрагмент вызывает onStart, затем onResume, затем onActivityResult, затем onResume снова, и я не могу понять,Почему. Это вызывает столько проблем.

Вот код:


Class extends ListFragment {
...
@Override
    public void onResume() {

        Log.i(TAG_LOG, "onResume");

        SharedPreferences pref = getActivity().getSharedPreferences(PreferenceKeys.PREF_NAME, MODE_PRIVATE);
        SharedPreferences.Editor editor = pref.edit();

        long timePassed;

        // goes here if the trial time has expired
        if ((pref.getBoolean(PreferenceKeys.TRIAL_DONE, false) && pref.getString(PreferenceKeys.USERNAME, "").equals("")) ||
                (!pref.getBoolean(PreferenceKeys.TRIAL, false) && pref.getString(PreferenceKeys.USERNAME, "").equals(""))) {

            Log.i(TAG_LOG, "onResume-first if");

            if (pref.getBoolean(PreferenceKeys.ON_RESUME_CALL, true)) {

                Log.i(TAG_LOG, "onResume-first if-onResumeCall");
                editor.putBoolean(PreferenceKeys.ON_RESUME_CALL, false);

                Intent intent = new Intent(getActivity(), LoginRegisterActivity.class);
                if (!pref.getBoolean(PreferenceKeys.TRIAL_DONE, false)) {
                    intent.putExtra("showTrialButton", true);
                }
                startActivityForResult(intent, REQUEST_LOGIN_REGISTER);
            }
        } else if (!pref.getBoolean(PreferenceKeys.TRIAL_DONE, false) &&
                mResponseReceiver == null &&
                (timePassed  = pref.getLong(PreferenceKeys.TRIAL_STARTING_TIME, 0)) != 0) {


            Log.i(TAG_LOG, "sono dentroooooo");

            //this happens when the application has been force stopped,
            //since the receiver would never be notified and the trial would never end
             if ((System.currentTimeMillis() - timePassed) >= (30 * 60 * 1000)) {


                if (onUserActionListener != null) {
                    onUserActionListener.onTrialEnded();
                }

            } else {

                 if (onUserActionListener != null) {
                     onUserActionListener.onTrialStarted();
                 }
             }
        }
super.onResume();
}
...
@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        Log.i(TAG_LOG, "onActivityResult");

        if (requestCode == REQUEST_LOGIN_REGISTER) {
            if(resultCode == Activity.RESULT_OK){

                String username;
                String password;

                SharedPreferences preferences = getActivity().getSharedPreferences(PreferenceKeys.PREF_NAME, MODE_PRIVATE);
                SharedPreferences.Editor editor = preferences.edit();

                if ((!data.hasExtra(PreferenceKeys.USERNAME))) {
                    if(data.getBooleanExtra(PreferenceKeys.TRIAL, false) &&
                            !preferences.getBoolean(PreferenceKeys.TRIAL, false)) {

                        editor.putBoolean(PreferenceKeys.ON_RESUME_CALL, true).apply();

                        // this is used to show the log in button while mode is trial
                        onUserActionListener.onTrialStarted();

                    }
                } else {

                    // TODO: manage the connection with the server

                    username = data.getStringExtra(PreferenceKeys.USERNAME);
                    password = data.getStringExtra(PreferenceKeys.PASSWORD);


                    onUserActionListener.onUserConnected(username, password);

                }
            }
            if (resultCode == Activity.RESULT_CANCELED) {
                //Write your code if there's no result
            }
        }
    }
...
}

public class LoginRegisterActivity extends Activity {

    private Button trialButton;

    public static final int REQUEST_CODE_REGISTER = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login_register);

        final Intent intent = new Intent();


        if (getIntent().hasExtra("showTrialButton") && getIntent().getExtras().getBoolean("showTrialButton")) {

            findViewById(R.id.trial_button).setVisibility(View.VISIBLE);

        }


        trialButton = findViewById(R.id.trial_button);
        trialButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                intent.putExtra(PreferenceKeys.TRIAL, true);
                setResult(RESULT_OK, intent);
                finish();
            }
        });
    }


}

Вот что печатает журнал:

onStart onResume onResume-first если onResume-first if-onResumeCall onActivityResult onResume

Я просто не понимаю. Кто-нибудь знает, как это решить?

1 Ответ

0 голосов
/ 10 ноября 2019

, если это произойдет, так что пусть это, не связывайтесь с ОС, просто чтобы прекратить создавать настоящие моменты, из-за этого вы можете сделать обертку для данных результата, как это:

public class MyDataWrapper<T> {
    private T t;
    private boolean dataHandled = false;

    public MyDataWrapper(){}

    public MyDataWrapper(T t){
        this.t = t;
    }

    public T getData(){
        dataHandled = true;
        return t;
    }

    public void setData(T t){
        if(this.t != t){
            this.t = t;
            dataHandled = false
        }
    }

    public boolean isDataHandled(){
        return dataHandled;
    }
}

и в своем фрагменте выможно сделать так:

class MyFragment extends ListFragment {

    private MyDataWrapper<MyData> myDataWrapper = new MyDataWrapper<>();

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data){
        if (/* all conditions are right */){
            myDataWrapper.setData(/* the data */);
        }
    }
    @Override
    public void onResume(){
        if (!myDataWrapper.isDataHandled()){
            // do the work
        } else {
            // data handled so there is no need to handle it again
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...