【问题标题】:Downloading and setting a wallpaper下载和设置壁纸
【发布时间】:2013-11-24 12:25:28
【问题描述】:

我有这段小代码,我想实现这个:程序应该从链接的图像中设置壁纸。

图片下载:

public class ImgDownload extends AsyncTask {
        private String requestUrl;
        private ImageView view;
        private Bitmap pic;

        private ImgDownload(String requestUrl, ImageView view) {
            this.requestUrl = requestUrl;
            this.view = view;
        }

        @Override
        protected Object doInBackground(Object... objects) {
            try {
                URL url = new URL(requestUrl);
                URLConnection conn = url.openConnection();
                pic = BitmapFactory.decodeStream(conn.getInputStream());
            } catch (Exception ex) {
            }
            return null;
        }

        @Override
        protected void onPostExecute(Object o) {
            view.setImageBitmap(pic);
        }
    }

主要

public class MainActivity extends Activity {

    private ImageView img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        img= (ImageView)findViewById(R.id.img);

//!!!! This is where I am stuck :)
        Object s = new ImgDownload("http://images1.wikia.nocookie.net/__cb20120402213849/masseffect/images/4/42/Uncharted_Worlds_Codex_Image.jpg",img );
    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

如何在我的 mainActivity 中实例化/创建此类,以便它可以从链接下载 img?任何帮助建议,想法,将不胜感激:)

【问题讨论】:

    标签: android image wallpaper


    【解决方案1】:

    你像这样执行这个 AsyncTask:

    ImgDownload downloader = new ImgDownload("http://images1.wikia.nocookie.net/__cb20120402213849/masseffect/images/4/42/Uncharted_Worlds_Codex_Image.jpg",img);
    downloader.execute();
    

    但我不建议使用您的代码,因为它会产生内存泄漏。例如,在下载图像时尝试旋转您的设备。我保证你的应用程序会崩溃。另外 AsyncTask 是一个泛型类。您可以使用它来使您的代码更简单一些。这是我改进的图像下载任务:

    public class ImgDownload extends AsyncTask<Void, Void, Bitmap> { // Use Generics
        private final String requestUrl;
        private final WeakReference<ImageView> imageViewReference; // Use WeakReference to prevent memory leaks
    
        public ImgDownload(String requestUrl, ImageView view) {
            this.requestUrl = requestUrl;
            this.imageViewReference = new WeakReference<ImageView>(view);
        }
    
        @Override
        protected Bitmap doInBackground(Void... objects) {
            try {
                URL url = new URL(requestUrl);
                URLConnection conn = url.openConnection();
                return BitmapFactory.decodeStream(conn.getInputStream()); // Return bitmap instead of using global variable
            } catch (Exception ex) {
            }
            return null;
        }
    
        @Override
        protected void onPostExecute(Bitmap bitmap) {
            ImageView imageView = imageViewReference.get();
            if(imageView != null && bitmap != null) { // Check if image or ImageView are null
                imageView.setImageBitmap(bitmap);
            }
        }
    } 
    

    【讨论】:

    • Eclipse 告诉我将构造函数的可见性更改为默认值
    • 我忽略了您的代码中的另一个错误,您有一个私有构造函数,但您需要一个公共构造函数。我相应地编辑了我的答案。
    • 谢谢,现在一切看起来都很棒!
    【解决方案2】:
    new ImgDownload("http://images1.wikia.nocookie.net/__cb20120402213849/masseffect/images/4/42/Uncharted_Worlds_Codex_Image.jpg", MainActivity.img).execute();
    

    【讨论】:

    • 这是错误的。 MainActivity.img 应该是 this.img。请参阅我的答案以获得更好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多