ImageView 不更新 onActivityResult 的变化
Posted
技术标签:
【中文标题】ImageView 不更新 onActivityResult 的变化【英文标题】:ImageView not updating on change in onActivityResult 【发布时间】:2017-05-01 09:58:28 【问题描述】:我尝试过使用 Picasso 以及我在 *** 上可能找到的所有方法。我正在用相机拍摄图像并获得 onActivity 结果的值。只有在我退出并重新启动应用程序后,imageView 才会更新。我希望 imageview 在我眼前改变。似乎没有任何代码在工作。
我试过了
getActivity().runOnUiThread(new Runnable()
@Override
public void run()
profile.setImageBitmap(thumbnail);
);
点击确定后关闭相机视图时没有任何反应。
我也试过这个:
Thread thread = new Thread()
@Override
public void run()
getActivity().runOnUiThread(new Runnable() //run on ui thread
public void run()
profile.setImageBitmap(thumbnail);
);
;
thread.start();
但 UI 没有改变,图像保持不变。
我试过异步任务,毕加索也不行。
想知道怎么做,已经有一段时间了,我非常沮丧
以下是两种技术的代码:
public void onActivityResult(int requestCode, int resultCode, Intent data)
if (requestCode == 1 && data != null)
final Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
thumbnail.compress(Bitmap.CompressFormat.JPEG, 90, bytes);
final File destination = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "temp.jpg");
FileOutputStream fo;
try
fo = new FileOutputStream(destination);
fo.write(bytes.toByteArray());
fo.close();
catch (IOException e)
e.printStackTrace();
uploadProfilePicToS3(destination.getAbsolutePath());
//this doesn't work
Thread thread = new Thread()
@Override
public void run()
getActivity().runOnUiThread(new Runnable() //run on ui thread
public void run()
profile.setImageBitmap(thumbnail);
);
;
thread.start();
//not working either!
getActivity().runOnUiThread(new Runnable()
@Override
public void run()
profile.setImageBitmap(thumbnail);
);
【问题讨论】:
设置新图片后有没有试过profile.postInvalidate()
?
当onActivityResult()
被调用/返回、创建新线程或任何异步操作然后选择 runOnUiThread 时,您已经在 UI 线程上,然后选择 runOnUiThread 将不会影响图像是否显示 - 放一些休息指向 as 并检查是否调用了 onActivityResult..
@MarkKeen 之所以调用它,是因为当我重新启动应用程序时,更改才会生效。此外,这是从片段运行
尝试添加一些不同的文件名或将当前毫秒添加到文件名,如 temp123.jpg
你已经在主线程上,删除你的线程并尝试。
【参考方案1】:
您的ImageView
未更新的原因是因为 1) android 会加载缓存中的前一个图像,只要您将图像保存到相同的目标位置 2) 在 @987654323 之前调用 onActivityResult
@。这意味着当调用onResume
时,您加载到ImageView
中的图像会丢失。
第一个问题Glide
的signature
处理得很好,第二个问题可以onSavedInstanceState()
处理。
更改图像时创建Glide signature
。对于每个更改,这应该是不同的,例如当前时间。然后在加载图像时应用signature
。
public void onActivityResult(int requestCode, int resultCode, Intent data)
if (requestCode == 1 && data != null)
final Bitmap bitmap = (Bitmap) data.getExtras().get("data");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, bytes);
final File destination = new File(
Environment.getExternalStorageDirectory()
.getAbsolutePath(), "temp.jpg");
FileOutputStream fo;
try
fo = new FileOutputStream(destination);
fo.write(bytes.toByteArray());
fo.flush();
catch (IOException e)
e.printStackTrace();
Uri uri = Uri.fromFile(destination)
//Create your signature
SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMddHHmmss",
Locale.getDefault());
String timeStamp = dateFormat.format(new Date());
newImageSignature = new RequestOptions()
.signature(new ObjectKey(timeStamp));
//Load your image
Glide.with(yourActivity.this) // Or Fragment
.load(bitmap) // Or Uri
.apply(newImageSignature)
.into(imageView);
// You can save the uri and signature to Firebase Database,
// and your image to Storage here
然后将新的signature
保存在onSaveInstanceState()
中
@Override
protected void onSaveInstanceState(Bundle outState)
super.onSaveInstanceState(outState);
if (newImageSignature != null)
outState.putString("IMAGE_SIGNATURE”, newImageSignature.toString());
outState.putString("IMAGE_URI”, uri.toString());
现在您可以在onCreate()
中检索signature
Uri ImageUri;
ImageView imageView;
RequestOptions imageSignature;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
// Retrieve your saved parameters. Or get them from a database.
if (savedInstanceState != null)
imageSignature = new RequestOptions()
.signature(new
ObjectKey(savedInstanceState.getString("IMAGE_SIGNATURE")));
imageUri = Uri.parse(savedInstanceState.getString("IMAGE_URI"));
// Instantiate your imageview
// Load image
if(imageUri != null && imageSignature != null)
Glide.with(yourActivity.this) // Or Fragment
.load(bitmap) // Or Uri
.apply(newImageSignature)
.into(imageView);
注意:我刚刚写了这个,还没有测试。希望它给了
【讨论】:
以上是关于ImageView 不更新 onActivityResult 的变化的主要内容,如果未能解决你的问题,请参考以下文章
对于 ActivityResultContracts,应用内更新的替代方案是啥?