【问题标题】:Showing a bitmap url with AsyncTask使用 AsyncTask 显示位图 url
【发布时间】:2015-11-29 09:44:25
【问题描述】:

您好,我有一个不完整的代码。

代码如下:

package com.example.AsyckTest;

import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

public class MyActivity extends Activity {
    Button button;
    ImageView imageView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        init();
    }

    private void init() {
        button = (Button) findViewById(R.id.button);
        imageView = (ImageView) findViewById(R.id.imageView);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LoadBitmap load = new LoadBitmap();
                load.execute("");
            }
        });
    }

    public class LoadBitmap extends AsyncTask<String, Void, Bitmap> {
        ProgressDialog pd = new ProgressDialog(MyActivity.this);

        @Override
        protected void onPreExecute() {

            super.onPreExecute();

        }

        @Override
        protected Bitmap doInBackground(String... params) {
 Bitmap b;
            try {
                b= BitmapFactory.decodeStream((InputStream)new URL(params[0]).getContent());
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;

        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            if (bitmap !=null){

            }else {

            }
            pd.dismiss();
        }

    }
}

我的问题是我应该把网址放在哪里,或者我还应该做什么?

【问题讨论】:

    标签: android android-asynctask bitmapfactory


    【解决方案1】:

    您可以将 url 作为参数传递给异步任务构造函数,也可以传递给执行函数。

    第一种方式比较冗长,是一种通用的依赖注入和参数传递方法,适用于所有类和对象,第二种方式特定于Android框架提供的异步任务类。

    在构造函数中传递 url:

    public class LoadBitmap extends AsyncTask<String, Void, Bitmap> {
        private String mUrl;
    
        public LoadBitmap(String url) {
            mUrl = url;
        }
    
        @Override
        protected Bitmap doInBackground(String... params) {
            final String url = mUrl;
            // do stuff
        }
    }
    

    并使用它:

    LoadBitmap loadBitmap = new LoadBitmap("http://www.example.com/path/to/image");
    loadBitmap.execute();
    

    在执行方法中传递参数:

    public class LoadBitmap extends AsyncTask<String, Void, Bitmap> {
        @Override
        protected Bitmap doInBackground(String... params) {
            if (params.length == 0)
                throw new IllegalArgumentException("You should pass me a url!!");
            final String url = params[0];
            // do stuff
        }
    }
    

    而且可以这样使用:

    LoadBitmap loadBitmap = new LoadBitmap();
    loadBitmap.execute("http://www.example.com/path/to/image");
    

    在您的代码中,您应该返回b,而不是返回null。然后将该位图传递给onPostExecute,在那里您可以对该位图做任何您想做的事情,例如您可以在您的ImageView 中显示它。

        @Override
        protected Bitmap doInBackground(String... params) {
            Bitmap b = null;
            try {
                b = BitmapFactory.decodeStream((InputStream)new URL(params[0]).getContent());
            } catch (IOException e) {
                e.printStackTrace();
            }
            return b;
    
        }
    
        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            if (bitmap !=null){
                imageView.setImageBitmap(bitmap);
            }
            pd.dismiss();
        }
    

    【讨论】:

    • @Sahand.Setoodeh خواهش می‌کنم :)
    • @Sahand.Setoodeh بله。 شببسترینساستجوالوكوابة:-)فکفکنمستتتوسامنتامشکلداستیبازبازبازبازبازبازازازابیکویکیاریمینوسمونمیمنقضیهقضیهمونمیمنقضیهقضیهمونمیمنقضیهقضیه:)) span>
    【解决方案2】:

    我想你首先阅读更多关于 async 任务的内容。

    load.execute("");

    你必须传递 url,而不是传递一个空字符串

    如果您想通过单击按钮显示图像。

     button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    LoadBitmap load = new LoadBitmap();
                    load.execute("http://stackoverflow.com/");// Here is Url 
                }
            });
    

    Other Wise 将此 sn-p 代码放入 OnCreate

    LoadBitmap load = new LoadBitmap();
                        load.execute("http://stackoverflow.com/");// Here is Url
    

    更新

    你可以这样使用它

    @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            if (bitmap !=null){
    
    
    
         ImageView mImg;
    mImg = (ImageView) findViewById(R.id.(your xml img id));
    mImg.setImageBitmap(bitmap);
                }else {
    
            }
            pd.dismiss();
        }
    

    把这段代码放在 Asynktask 的 OnPostExecute 方法中

    【讨论】:

    • 谢谢,但我应该在哪里使用位图 b?请!这是一个必须完成的项目。
    • 可以在ImageView中使用
    猜你喜欢
    • 2012-12-05
    • 2011-07-29
    • 2016-10-02
    • 1970-01-01
    • 2014-03-07
    • 2012-07-20
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多