Android: Загрузка изображения с сети с Asynctask

Как я заменяю следующие строки кода Asynctask? Как Вы "возвращаете" Битовый массив из Asynctask?Спасибо.

ImageView mChart = (ImageView) findViewById(R.id.Chart);
String URL = "http://www...anything ...";

mChart.setImageBitmap(download_Image(URL));

public static Bitmap download_Image(String url) {

        //---------------------------------------------------
        Bitmap bm = null;
        try {
            URL aURL = new URL(url);
            URLConnection conn = aURL.openConnection();
            conn.connect();
            InputStream is = conn.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            bm = BitmapFactory.decodeStream(bis);
            bis.close();
            is.close();
        } catch (IOException e) {
            Log.e("Hub","Error getting the image from server : " + e.getMessage().toString());
        } 
        return bm;
        //---------------------------------------------------

    }

Я думал о чем-то вроде этого:

замена:

mChart.setImageBitmap(download_Image(graph_URL));

чем-то как:

mChart.setImageBitmap(new DownloadImagesTask().execute(graph_URL));

и

public class DownloadImagesTask extends AsyncTask<String, Void, Bitmap> {

@Override
protected Bitmap doInBackground(String... urls) {
    return download_Image(urls[0]);
}

@Override
protected void onPostExecute(Bitmap result) {
    mChart.setImageBitmap(result);              // how do I pass a reference to mChart here ?
}


private Bitmap download_Image(String url) {
    //---------------------------------------------------
    Bitmap bm = null;
    try {
        URL aURL = new URL(url);
        URLConnection conn = aURL.openConnection();
        conn.connect();
        InputStream is = conn.getInputStream();
        BufferedInputStream bis = new BufferedInputStream(is);
        bm = BitmapFactory.decodeStream(bis);
        bis.close();
        is.close();
    } catch (IOException e) {
        Log.e("Hub","Error getting the image from server : " + e.getMessage().toString());
    } 
    return bm;
    //---------------------------------------------------
}


}

но Как я передаю ссылку на mChart в onPostExecute (Растровый результат)??? Я должен передать его с URL в некотором роде? Я хотел бы заменить все свои строки кода:

mChart1.setImageBitmap(download_Image(URL_1));
mChart2.setImageBitmap(download_Image(URL_2));

с чем-то подобным..., но в Asynctask путь!

mChart1.setImageBitmap(new DownloadImagesTask().execute(graph_URL_1));
mChart2.setImageBitmap(new DownloadImagesTask().execute(graph_URL_2));

Существует ли легкое решение для этого? Я получаю что-то не так здесь?

36
задан Janusz 22 June 2010 в 10:49
поделиться

3 ответа

Если нет веской причины скачивать изображение самостоятельно, то я бы рекомендовал использовать Picasso.

Picasso избавит вас от всех проблем с загрузкой, установкой и кэшированием изображений. Весь код, необходимый для простого примера, находится здесь:

Picasso.with(context).load(url).into(imageView);

Если вы действительно хотите сделать все самостоятельно, воспользуйтесь моим старым ответом ниже.


Если изображение не очень большое, вы можете просто использовать анонимный класс для асинхронной задачи. Это будет выглядеть следующим образом:

ImageView mChart = (ImageView) findViewById(R.id.imageview);
String URL = "http://www...anything ...";

mChart.setTag(URL);
new DownloadImageTask.execute(mChart);

Класс Task:

public class DownloadImagesTask extends AsyncTask<ImageView, Void, Bitmap> {

ImageView imageView = null;

@Override
protected Bitmap doInBackground(ImageView... imageViews) {
    this.imageView = imageViews[0];
    return download_Image((String)imageView.getTag());
}

@Override
protected void onPostExecute(Bitmap result) {
    imageView.setImageBitmap(result);
}


private Bitmap download_Image(String url) {
   ...
}

Скрыть URL в теге немного сложно, но это выглядит более красиво в вызывающем классе, если у вас много изображений, которые вы хотите заполнить таким образом. Это также помогает, если вы используете ImageView внутри ListView и хотите знать, был ли ImageView переработан во время загрузки изображения.

Я написал, если Image не очень большой, потому что это приведет к тому, что задача будет иметь неявный указатель на основную деятельность, заставляя сборщик мусора держать всю деятельность в памяти, пока задача не завершится. Если пользователь перейдет на другой экран вашего приложения во время загрузки растрового изображения, память не сможет быть освобождена, и это может сделать ваше приложение и всю систему медленнее.

75
ответ дан 27 November 2019 в 05:22
поделиться

Это даст вам изображения любого размера ... если вам не нужен диалог выполнения, просто прокомментируйте коды в onPreExecute ();

for(int i = 0 ; i < no_of_files ; i++ )
 new FetchFilesTask().execute(image_url[i]);


private class FetchFilesTask extends AsyncTask<String, Void, Bitmap> {

    private ProgressDialog dialog = new ProgressDialog(FileExplorer.this);
    Bitmap bitmap[];
    protected void onPreExecute(){
        dialog.setMessage("fetching image from the server");
        dialog.show();
    }

     protected Bitmap doInBackground(String... args) {

             bitmap = getBitmapImageFromServer();
         return bitmap;
     }

     protected void onPostExecute(Bitmap m_bitmap) {
         dialog.dismiss();
         if(m_bitmap != null)
             //store the images in an array or do something else with all the images.   
     }
 }

public Bitmap getBitmapImageFromServer(){

    // fetch image form the url using the URL and URLConnection class
}
1
ответ дан 27 November 2019 в 05:22
поделиться

можно создать класс, скажем, .. BkgProcess, который содержит внутренний класс, расширяющий AsyncTask. при создании экземпляра BkgProcess передайте контекст вашего класса Activity в конструкторе BkgProcess. например:

public class BkgProcess {

 String path;   
 Context _context;

public Download(Downloader downloader, String path2){

 this.path = path2;
    _context = downloader;

}

public void callProgressDialog(){

new BkgProcess().execute((Void)null);
}
class Downloads extends AsyncTask<Void, Void, Boolean> {
    private ProgressDialog dialog = new ProgressDialog(_context);
    protected void onPreExecute(){
        dialog.setMessage("Downloading image..");
        dialog.show();
    }

    protected void onPostExecute(Boolean success) {
        dialog.dismiss();
        if(success)
            Toast.makeText(_context, "Download complete", Toast.LENGTH_SHORT).show();
    }

@Override
protected Boolean doInBackground(Void... params) {
    return(startDownload(path));

    }


public boolean startDownload(String img_url) {

// download img..

      return true;
}
}
}

из вашего класса деятельности ..

BkgProcess dwn = new BkgProcess (Your_Activity_class.this, img_path);

dwn.callProgressDialog();
2
ответ дан 27 November 2019 в 05:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: