Запрос на залп не обновляет данные, возвращаемые из другого действия

Я застрял на этом некоторое время, поэтому я, наконец, ищу некоторые подсказки. Основное действие моего приложения выполняет запрос Volley GET onCreate, и мои элементы ListView отображаются нормально. Щелкнув элемент в списке, я передаю некоторые данные другому действию, где затем выполняю запрос POST Volley, который обновляет мою БД. Затем я возвращаюсь к своей основной деятельности, где ранее выбранный элемент ListView должен немедленно обновиться (исчезнуть из списка или изменить TextViews и т. д.), но, похоже, будет один цикл позади, если я выберу другой элемент и повторю процесс.

Я тестировал разные вещи с onResume, но не могу заставить его работать. Я даже поместил весь запрос залпа в метод и попытался вызвать его onResume, но это приводит к зависанию моего диалога прогресса и дублированию всего в списке. Тем не менее, ручное обновление списка, вызванное методом из панели инструментов, работает нормально, а также запрос из запускаемого по времени.

Активность списка пользователей

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

//Setting adapter to the listView
 listView =(ListView) findViewById(R.id.list);

adapter =new CustomListAdapter(this,userList);
listView.setAdapter(adapter);

// Showing progress dialog before making http request
pDialog =new ProgressDialog(this);
pDialog.setMessage("Loading...");
pDialog.show();

if(userList!=null) {
    userList.clear();
}

// Creating volley request obj
 JsonArrayRequest userReq = new JsonArrayRequest(url,
    new Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray response) {
            Log.d(TAG, response.toString());
            hidePDialog();

            // Parsing json
            for (int i = 0; i < response.length(); i++) {
                try {

                    JSONObject obj = response.getJSONObject(i);
                    User user = new User();
                    user.setUserId(obj.getString("user_id"));
                    user.setFirstName(obj.getString("firstname"));
                    user.setLastName(obj.getString("lastname"));

                    // adding user to users array
                    userList.add(user);

                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }

            adapter.notifyDataSetChanged();
        }
    }, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
    VolleyLog.d(TAG, "Error: " + error.getMessage());
    hidePDialog();

 }
});

    //Passing Data to UserDetailActivity
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
            int UserDetailActivity = 1;
            Intent i = new Intent(UserListActivity.this, UserDetailActivity.class);
            i.putExtra("user_id", userList.get(position));
            i.putExtra("firstname", userList.get(position));
            i.putExtra("lastname", userList.get(position));
            startActivityForResult(i, UserDetailActivity);
        }
    });

}

// Adding request to request queue
AppController.getInstance().addToRequestQueue(userReq);


@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == 1 && resultCode == RESULT_OK) {

        //Calling the volley method below
        volleyRequest();

    }
}


//Collapsed volley method, same as onCreate
public void volleyRequest() {...}

UserDetailActivity

//Update Status
private void updateStatus() {

    SharedPreferences sharedPreferences = getSharedPreferences(Config.SHARED_PREF_NAME, Context.MODE_PRIVATE);
    final String user_id = sharedPreferences.getString(Config.user_id,"Not Available");
    final String user_status = "ONLINE";

    StringRequest stringRequest = new StringRequest(Request.Method.POST, Config.USERSTATUS_URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    Toast.makeText(UserDetailActivity.this, response, Toast.LENGTH_LONG).show();
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(UserDetailActivity.this, error.getMessage(), Toast.LENGTH_LONG).show();
                }
            }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<>();
            params.put("user_status", user_status);
            params.put("user_id", user_id);
            return params;
        }
    };

    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);

    //Calling method below
    finishAndSetResult();

    //Intent intent = new Intent(this, UserListActivity.class);
    //startActivity(intent);
}

private void finishAndSetResult() {
    if (getParent() == null) {
        setResult(RESULT_OK, null);
    } else {
        getParent().setResult(RESULT_OK, null);
    }
    finish();
}

Обновление — решение

Итак, я понял, что использую два разных запроса. Один с моим классом AppController, который выполняет немедленное обновление, а другой, похоже, ждет, пока не произойдет другое событие в потоке пользовательского интерфейса (?):

// Correct one to use
AppController.getInstance().addToRequestQueue(userReq);

//Delayed
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);

person glokul    schedule 14.07.2017    source источник
comment
Таким образом, вы загружаете ListView с помощью запроса GET, затем вы открываете новую активность, в которой вы изменяете источник своей информации (БД) с помощью запроса POST, но затем вы ожидаете, что ListView будет обновлен после того, как вы вернетесь к деятельности, которая содержит Это? Дайте мне знать, если я пойму, в чем ваша проблема.   -  person FerDensetsu    schedule 14.07.2017
comment
Точно!! Мне нужно, чтобы он немедленно обновлялся, чтобы отражать изменения в базе данных. Буду ли я что-то делать с onResume?   -  person glokul    schedule 14.07.2017
comment
Нет, если вы открываете новое действие, которое, как вы ожидаете, изменит или вернет результат вызывающему его действию, вам следует что-то сделать с onActivityResult. Я объясню в ответ.   -  person FerDensetsu    schedule 14.07.2017


Ответы (2)


Вы должны вызвать действие, которое запускает почтовый запрос, с помощью startActivityForResult:

int POST_ACTIVITY = 1;
Intent i = new Intent(this, PostActivity.class);
startActivityForResult(i, POST_ACTIVITY);

В вашей почтовой активности, как только вы узнаете, что запрос был отправлен на сервер без ошибок, вы можете вызвать следующий метод, чтобы завершить его и вернуться к активности списка:

private void finishAndSetResult() {
    if (getParent() == null) {
        setResult(RESULT_OK, null);
    } else {
        getParent().setResult(RESULT_OK, null);
    }
    finish();
}

Вернитесь снова в свою активность списка, переопределите метод onActivityResult:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == POST_ACTIVITY && resultCode == RESULT_OK) {
        //Clear any data in your listview, relaunch the get request
        //and populate it again
    }
}
person FerDensetsu    schedule 14.07.2017
comment
Отлично, попробую, когда вернусь домой, сэр. - person glokul; 14.07.2017
comment
ОК, я добавил предложенный код, но все еще не получил результата. Я отредактировал свой исходный пост, чтобы показать, где были мои правки. Мне интересно, неправильно ли мое размещение методов? - person glokul; 15.07.2017

Разобрался, обновите в исходном посте. Оказывается, мне не нужен startActivityForResult() или что-то в этом роде, как было предложено. Спасибо за попытку помочь FerDensetsu :)

person glokul    schedule 15.07.2017