Я обновляю набор внутри onResponse
обратного вызова залпа как это:сделать Java установить THREADSAFE
@Override
public void onResponse(String response)
{
if (!response.equals(Properties.PRODUCT_NOT_FOUND) || !response.equals(Properties.USER_NOT_FOUND))
{
if (user.getFavoriteProducts().contains(product.getId()))
{
user.getFavoriteProducts().remove(product.getId());
} else {
user.getFavoriteProducts().add(product.getId());
}
mSharedPreferencesManager.insertUser(user);
}
}
Когда два ответа принимаются в то же время этот набор accesed одновременно. Я пытаюсь сделать этот набор поточно, но я не могу заставить его работать, это то, что я пытался до сих пор:
Используйте SynchronizedSet:
user.setFavoriteProducts(Collections.synchronizedSet(new HashSet<Long>()));
Используйте CopyOnWriteArraySet:
user.setFavoriteProducts(new CopyOnWriteArraySet<Long>());
Синхронизировать код внутри обратного вызова:
private static final Object object = new Object();
@Override
public void onResponse(String response)
{
synchronized (object)
{
if (!response.equals(Properties.PRODUCT_NOT_FOUND) || !response.equals(Properties.USER_NOT_FOUND))
{
if (user.getFavoriteProducts().contains(product.getId()))
{
user.getFavoriteProducts().remove(product.getId());
} else {
user.getFavoriteProducts().add(product.getId());
}
mSharedPreferencesManager.insertUser(user);
}
}
}
Ни один из этих продуктов не работал, любая помощь была бы оценена!
EDIT: Не работает, что вставлен только один элемент.
EDIT 2: Я пробовал подход N0un и до сих пор только один элемент вставлен
Это код, который я использовал:
@Override
public void onResponse(final String response)
{
Log.d(Properties.TAG, "[REST_CLIENT] Response received: " + response);
AsyncTask.execute(new Runnable()
{
@Override
public void run()
{
synchronized (RestClient.class)
{
if (!response.equals(Properties.PRODUCT_NOT_FOUND) || !response.equals(Properties.USER_NOT_FOUND))
{
if (user.getFavoriteProducts().contains(product.getId()))
{
Log.d(Properties.TAG, "[REST_CLIENT] Removing product from favorites: " + product.getId());
user.getFavoriteProducts().remove(product.getId());
} else {
Log.d(Properties.TAG, "[REST_CLIENT] Adding product to favorites: " + product.getId());
user.getFavoriteProducts().add(product.getId());
}
Log.d(Properties.TAG, "[REST_CLIENT] Updating user");
mSharedPreferencesManager.insertUser(user);
Log.d(Properties.TAG, "[REST_CLIENT] Set size: " + user.getFavoriteProducts().size());
}
}
}
});
}
Эти журналы I «получаю:
D/CUOKA: [REST_CLIENT] Response received: ACCEPTED
D/CUOKA: [REST_CLIENT] Adding product to favorites: 3921
D/CUOKA: [REST_CLIENT] Updating user
D/CUOKA: [REST_CLIENT] Response received: ACCEPTED
D/CUOKA: [REST_CLIENT] Set size: 1
D/CUOKA: [REST_CLIENT] Adding product to favorites: 2361
D/CUOKA: [REST_CLIENT] Updating user
D/CUOKA: [REST_CLIENT] Set size: 1
РЕДАКТИРОВАТЬ 3: это код для вставки пользователя в SharedPreferences:
public synchronized boolean insertUser(final User user)
{
mEditor = mSharedPreferences.edit();
Gson gson = new Gson();
String json = gson.toJson(user);
mEditor.putString(KEY_USER, json);
return mEditor.commit();
}
* но я не могу заставить его работать *? Что происходит? – GurV
Просьба представить информацию о том, что не сработало. Как вы протестировали и какое неправильное поведение вы видите. – gba
@GurwinderSingh Извините, я редактировал вопрос. В комплект входит только один из элементов. – cuoka