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 中的图像会丢失。

第一个问题Glidesignature处理得很好,第二个问题可以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 的变化的主要内容,如果未能解决你的问题,请参考以下文章

ImageView 没有正确更新

imageview 未相应更新

对于 ActivityResultContracts,应用内更新的替代方案是啥?

无法在工具栏中更新TextView和ImageView

Android UI更新中 ImageView使用setBackgroundResource多次更新图片失效

在android中经常更新ImageView