Java ImageView在onActivityResult中更改时未更新
我试过使用毕加索和我在stackoverflow上能找到的所有方法。我用相机拍摄了一张照片,得到了活动结果的值。只有在退出并重新启动应用程序后,imageView才会更新。我想改变我眼前的景象。所有代码似乎都不起作用 我试过这个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.
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);
}
}