我想在我的应用程序中更新头像。每次用户更新他的个人资料照片。但是问题是个人资料图片仅在我从内存中清除应用程序后重新启动应用程序时才更新。
我要自动实现的代码放在 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始终在用户更新其dp时自动更新。我该怎么办?我应该在哪里放置该代码?
答案 0 :(得分:1)
您可以使用Livedata观察数据更改,然后在实时数据的观察器中更新视图。如果内部存储是由Room管理的,则可以使其返回Livedata并从那里进行存储。
乍一看,我会做这样的事情(在这里使用Kotlin,但我相信您会理解的):
为活动创建一个view model,它将管理活动状态。视图模型将具有类型为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
}
在活动中对此进行观察。每当恢复活动并进行更改时,视图都会更新:
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方法上并使用它来完成,但是这种趋势倾向于创建易于出错且难以更改和/或维护的耦合设计。
答案 1 :(得分:0)
用户如何更新其个人资料图片?每当用户更新个人资料照片时,您都可以使用Picasso。
答案 2 :(得分:0)
您可以在onActivityResult中使用毕加索
* edit:添加了代码示例
@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(
}
}
}