Как автоматически обновить вид деятельности при изменении данных? - PullRequest
0 голосов
/ 21 января 2019

Я хочу обновить изображение профиля в моем приложении.Каждый раз Пользователь обновляет фотографию своего профиля.Но проблема в том, что изображение профиля обновляется только после перезапуска приложения после очистки приложения из памяти.

Код, который я хочу реализовать автоматически, помещается в метод onCreate .И загруженная картинка всегда будет из внутреннего хранилища.Код прилагается ниже.

mImageView = findViewById(R.id.profile_Pic);
    ContextWrapper cw = new ContextWrapper(getApplicationContext());
    File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
    File myImageFile = new File(directory, "my_image.jpeg");
    Picasso.get().load(myImageFile).into(mImageView);

Я хочу, чтобы IMageView для рисунка профиля всегда обновлялся автоматически, когда пользователь обновляет свой дп. Что мне делать или где разместить этот код?

Ответы [ 3 ]

0 голосов
/ 21 января 2019

Вы можете использовать Пикассо в onActivityResult

* редактировать: добавлен пример кода

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request we're responding to
    if (requestCode == TAKE_PICTURE || requestCode == PICK_FROM_GALLERY) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
           // DO SOMETHING
            Picasso.with(this).load(myImageFile).into(
        }
    }
}
0 голосов
/ 21 января 2019

Вы можете использовать Livedata для наблюдения за изменениями данных, а затем обновить представление в обозревателе Liveata. Если внутреннее хранилище управляется Room , вы можете заставить его вернуть Livedata и перейти оттуда.

На первый взгляд, я бы сделал что-то подобное (используя Kotlin здесь, но я уверен, что вы поймете):

  1. Создайте модель представления для Действия, которая будет управлять состоянием Действия. Модель представления будет иметь Livedata типа File:

    class MyViewModel : ViewModel() {
    
    
        private val dataAccess: SomeClassThatControlsDataAccess = ...
        private val _myImageFile: MutableLiveData<File> = MutableLiveData()
    
        val myImageFile: LiveData<File>
            get() = _myImageFile
    
    
        fun updateUserProfilePic() {
          val image: File = dataAccess.getProfilePicFromStorage() // This method would encapsulate that file retrieval code you have on OnCreate
          _myImageFile.value = image
        }
        // other stuff
    }
    
  2. Обратите внимание на это в упражнении. Всякий раз, когда действие возобновляется и происходит изменение, представление обновляется:

    class MyActivity : AppCompatActivity() {
    
        private lateinit var mModel: MyViewModel
        // ...
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            // Other code to setup the activity...
    
            // Get the ViewModel
            mModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
    
    
            // Observe the LiveData
            mModel.myImageFile.observe(this, Observer {
              Picasso.get().load(it).into(mImageView)
            })
        }
    
    
        override fun OnResume() {
            super.OnResume()
            mModel.updateUserProfilePic()
        }
    }
    

Если вы не хотите использовать какие-либо вещи для платформы Android, вы можете использовать что-то вроде RxJava и следовать аналогичному подходу.

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

0 голосов
/ 21 января 2019

Как пользователь обновляет фотографию своего профиля? Вы можете использовать Picasso каждый раз, когда пользователь обновляет фотографию своего профиля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...