2013-11-24 4 views
0

У меня есть этот маленький фрагмент кода, и я хочу достичь этого: программа должна установить обои из связанного изображения.Загрузка и установка обоев

ImgDownload:

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 из ссылки? Любые предложения, помощь, мысли будут оценены :)

ответ

1

Вы выполнить эту AsyncTask так:

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

Но я бы не рекомендовал использовать свой код, он будет производить утечки памяти. Например, попробуйте повернуть устройство во время загрузки изображения. Я гарантирую, что ваше приложение выйдет из строя. Plus 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); 
     } 
    } 
} 
+0

Eclipse говорит мне изменить видимость конструктора по умолчанию – whiteLT

+0

В вашем коде была другая ошибка, которую я упустил, у вас был частный конструктор, но вам нужен публичный. Я отредактировал свой ответ соответственно. –

+0

Спасибо, сейчас все отлично! – whiteLT

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

Это неправильно. MainActivity.img должен быть this.img. См. Мой ответ для лучшего решения. –

Смежные вопросы