Java ImageView在onActivityResult中更改时未更新

Java ImageView在onActivityResult中更改时未更新,java,android,imageview,picasso,ui-thread,Java,Android,Imageview,Picasso,Ui Thread,我试过使用毕加索和我在stackoverflow上能找到的所有方法。我用相机拍摄了一张照片,得到了活动结果的值。只有在退出并重新启动应用程序后,imageView才会更新。我想改变我眼前的景象。所有代码似乎都不起作用 我试过这个 getActivity().runOnUiThread(new Runnable() { @Override public void run() { profile.

我试过使用毕加索和我在stackoverflow上能找到的所有方法。我用相机拍摄了一张照片,得到了活动结果的值。只有在退出并重新启动应用程序后,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();
但用户界面并没有改变,图像保持不变

我试过异步任务,毕加索也不行

Idk如何做到这一点,已经有一段时间了,我非常沮丧

以下是两种技术的代码:

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);
                }
            });

您的
ImageView
未更新的原因是1)只要您将图像保存到同一目标,Android就会加载缓存中的上一个图像2)在
onResume
之前调用
onActivityResult
。这意味着调用
onResume
时,加载到
ImageView
中的图像将丢失

第一个问题可以通过
Glide
signature
很好地处理,第二个问题可以通过
onSavedInstanceState()
处理

更改图像时创建一个
滑动签名
。对于每次更改,例如当前时间,这应该是不同的。然后在加载图像时应用
签名

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
然后将新的
签名保存在
onSaveInstanceState()

现在,您可以在
onCreate()


注:我只是写了这个,还没有测试。希望它能给出您的
ImageView
未更新的原因是1)只要您将图像保存到同一目标,Android就会加载缓存中的上一个图像2)在
onResume
之前调用
onActivityResult
。这意味着调用
onResume
时,加载到
ImageView
中的图像将丢失

第一个问题可以通过
Glide
signature
很好地处理,第二个问题可以通过
onSavedInstanceState()
处理

更改图像时创建一个
滑动签名
。对于每次更改,例如当前时间,这应该是不同的。然后在加载图像时应用
签名

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
然后将新的
签名保存在
onSaveInstanceState()

现在,您可以在
onCreate()


注:我只是写了这个,还没有测试。希望它给出

设置新映像后您是否尝试过
profile.postInvalidate()
?当调用/返回
onActivityResult()
时,您已经在UI线程上,正在创建新线程,或者任何异步操作,然后选择runOnUiThread对是否显示图像没有影响-在as中放置一些断点,并检查是否调用了onActivityResult..@MarkKeen,因为重新启动应用程序时更改生效。此外,这是从一个片段运行的。尝试添加一些不同的文件名或向文件名添加CurrentMilisons,如temp123.jpgyou已经在主线程上,请删除您的线程并重试。设置新图像后是否尝试了
profile.postInvalidate()
?当
onActivityResult()时,您已经在UI线程上了
被调用/返回,创建新线程或任何异步操作,然后选择runOnUiThread对是否显示图像没有影响-在as中放置一些断点,并检查onActivityResult是否被调用。@MarkKeen调用它是因为重新启动应用程序时更改生效。另外,这是从一个片段运行的。尝试添加一些不同的文件名或向文件名添加currentmiliseconds,如temp123.jpgy。如果您已经在主线程上,请删除您的线程并重试。
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);
    }
}