0

我想在我的应用中更新个人资料图片。每次用户更新他的个人资料图片。但问题是个人资料图片仅在我从内存中清除应用程序后重新启动应用程序时更新。

我想自动实现的代码放在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);

我希望当用户更新他/她的 dp 时,个人资料图片的 IMageView 始终自动更新。我应该做什么或应该在哪里放置该代码?

4

3 回答 3

1

您可以使用Livedata来观察数据变化,然后在 livedata 的观察者中更新视图。如果内部存储由Room管理,您可以让它返回一个 Livedata 并从那里开始。

乍一看,我会做这样的事情(在这里使用 Kotlin,但我相信你会理解):

  1. 为 Activity创建一个视图模型,用于管理 Activity 状态。视图模型将具有 File 类型的 Livedata:

    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. 在活动中观察这一点。每当 Activity 恢复并且有更改时,视图都会更新:

    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 方法上并完成它,但这倾向于创建容易出现错误且难以更改和/或维护的耦合设计。

于 2019-01-21T17:30:11.160 回答
0

用户如何更新他们的个人资料图片?每次用户更新他们的个人资料图片时,您都可以使用 Picasso。

于 2019-01-21T16:23:51.013 回答
0

您可以在 onActivityResult 中使用 Picasso

*编辑:添加代码示例

@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(
        }
    }
}
于 2019-01-21T16:42:48.000 回答