因此,在onCreate中,我尝试使用另一个可以通过URL访问的导航视图标题更改图像。我正在使用AsyncTask来执行此操作:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sidebar_menu);
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
View headerView = navigationView.getHeaderView(0);
User u = MainProvider.sharedInstance().getCurrentUser(this);
TextView usernameText = (TextView) headerView.findViewById(R.id.usernameText);
ImageView profilePicture = (ImageView)headerView.findViewById(R.id.profilePicture);
String profilePictureUrl = u.getSettings().get("profile_picture").getAsString();
new convertUrlToBitmap().execute(profilePictureUrl);
profilePicture.setImageBitmap();
}
我的AsyncTask看起来像这样:
class convertUrlToBitmap extends AsyncTask<String, Void, Bitmap> {
private Exception exception;
protected Bitmap doInBackground(String... urls) {
try {
URL url = new URL(urls[0]);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(input);
connection.disconnect();
return myBitmap;
} catch (IOException e) {
// Log exception
return null;
}
}
protected void onPostExecute(Bitmap myBitmap) {
// TODO: check this.exception
// TODO: do something with the feed
}
}
我无法理解的是如何在setImageBitmap方法中使用我从任务中获得的内容:
profilePicture.setImageBitmap()
谢谢大家的时间和精力!
答案 0 :(得分:0)
不是将profilePicture
添加为局部变量,而是将其添加为全局变量,而在onPostExecute
上,只需设置位图
您的主要活动
private ImageView profilePicture
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sidebar_menu);
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
View headerView = navigationView.getHeaderView(0);
User u = MainProvider.sharedInstance().getCurrentUser(this);
TextView usernameText = (TextView) headerView.findViewById(R.id.usernameText);
profilePicture = (ImageView)headerView.findViewById(R.id.profilePicture);
String profilePictureUrl = u.getSettings().get("profile_picture").getAsString();
new convertUrlToBitmap().execute(profilePictureUrl);
profilePicture.setImageBitmap();
}
你的PostExecute
protected void onPostExecute(Bitmap myBitmap) {
// TODO: check this.exception
// TODO: do something with the feed
profilePicture.setImageBitmap(myBitmap)
}
注意:
您可以使用HttpURLConnection
lib,而不是使用Glide
下载,官方Android文档也建议使用Glide
使用Glide你可以这样使用,
Glide.with(this).load(profilePictureUrl).diskCacheStrategy(DiskCacheStrategy.ALL).placeholder(R.drawable.ic_user).into(profilePicture);
答案 1 :(得分:0)
您可以使用onBitmapLoaded方法创建接口回调,并将此接口用作AsyncTask的参数。
但是要知道,对于图像加载,您可以使用像Picasso或Glide这样的第三方库,这些库是为异步图像提取而设计的,具有良好的文档记录和易于使用。
答案 2 :(得分:0)
设置asynctask的postExecute方法中的任何视图,因为它在UI线程中运行。您已经在post execute方法中返回位图,因此您只需要进行此更改。这是因为你的asynctask在你的活动中。
class convertUrlToBitmap extends AsyncTask<String, Void, Bitmap> {
private Exception exception;
protected Bitmap doInBackground(String... urls) {
try {
URL url = new URL(urls[0]);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(input);
connection.disconnect();
return myBitmap;
} catch (IOException e) {
// Log exception
return null;
}
}
protected void onPostExecute(Bitmap myBitmap) {
// TODO: check this.exception
// TODO: do something with the feed
profilePicture.setImageBitmap(myBitmap)
}
}
另一个非常简单有效的解决方案是使用Picasso或Glide库,因为您已经有了图像网址。它将减少你的工作创建asynctask。只需在您的gradle中添加此库。
compile 'com.squareup.picasso:picasso:2.5.2'
并对您的活动进行此更改。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sidebar_menu);
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
View headerView = navigationView.getHeaderView(0);
User u = MainProvider.sharedInstance().getCurrentUser(this);
TextView usernameText = (TextView) headerView.findViewById(R.id.usernameText);
ImageView profilePicture = (ImageView)headerView.findViewById(R.id.profilePicture);
String profilePictureUrl = u.getSettings().get("profile_picture").getAsString();
Picasso.with(this)
.load(profilePictureUrl)
.placeHolder(defaultPicId) //this image will display until your result image is ready
.error(defaultErrorPicId) //this image will display in case of error.
.into(profilePicture)
}
我强烈建议您使用毕加索库。