使用AsyncTask更改菜单标题图像

时间:2017-08-15 14:45:38

标签: android android-asynctask

因此,在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()

谢谢大家的时间和精力!

3 个答案:

答案 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这样的第三方库,这些库是为异步图像提取而设计的,具有良好的文档记录和易于使用。

http://square.github.io/picasso/

https://github.com/bumptech/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)
}

我强烈建议您使用毕加索库。