【问题标题】:How to load images from a URL txt doc, in Async Task?如何在异步任务中从 URL txt 文档加载图像?
【发布时间】:2011-07-20 11:21:51
【问题描述】:

我从网站 txt 文档加载图像。文本文档包含图像的 URL。

我不希望这会阻止主 UI,因为它确实希望从文本文档中加载图像。

我想做的是在后台的 AsyncTask 中加载 URL 或其他什么。 然后将图像 URL 存储在变量中并发送到我将创建的 Lazy Downloader。

有人可以给我一个示例,说明如何将我想从网站文本文档 (http://www.example.com/sites/images.txt) 加载图像 URL 的部分实际放在我知道的位置如何从文件中加载文本,只是不知道如何在 AsyncTask 中执行。

一个例子将不胜感激!

  public void getImages() throws IOException{

    DefaultHttpClient httpclient = new DefaultHttpClient();

    HttpGet httppost = new HttpGet("https://sites.google.com/site/theitrangers/images/webImages.txt");
    HttpResponse response;

        response = httpclient.execute(httppost);


            HttpEntity ht = response.getEntity();

            BufferedHttpEntity buf = new BufferedHttpEntity(ht);

            InputStream is = buf.getContent();


            BufferedReader r = new BufferedReader(new InputStreamReader(is));

            StringBuilder total = new StringBuilder();
            String line;
            while ((line = r.readLine()) != null) {
                total.append(line + "\n");

              imageUrl = total.toString();
            }

            }
            public void getImage2() throws IOException{

                DefaultHttpClient httpclient = new DefaultHttpClient();

                HttpGet httppost = new HttpGet("https://sites.google.com/site/theitrangers/images/webImage2.txt");
                HttpResponse response;

                    response = httpclient.execute(httppost);


                        HttpEntity ht = response.getEntity();

                        BufferedHttpEntity buf = new BufferedHttpEntity(ht);

                        InputStream is = buf.getContent();


                        BufferedReader r = new BufferedReader(new InputStreamReader(is));

                        StringBuilder total = new StringBuilder();
                        String line;
                        while ((line = r.readLine()) != null) {
                            total.append(line + "\n");

                          imageUrl2 = total.toString();

                        }

}
            public class ImageAdapter extends BaseAdapter {
                /** The parent context */
                private Context myContext;public ImageAdapter() {
                    // TODO Auto-generated constructor stub
                }
                /** URL-Strings to some remote images. */

                private String[] myRemoteImages = {imageUrl,imageUrl2};






                /** Simple Constructor saving the 'parent' context. */
                public ImageAdapter(Context c) { this.myContext = c; }

                /** Returns the amount of images we have defined. */
                public int getCount() { return this.myRemoteImages.length; }

                /* Use the array-Positions as unique IDs */
                public Object getItem(int position) { return position; }
                public long getItemId(int position) { return position; }

                /** Returns a new ImageView to
                * be displayed, depending on
                * the position passed. */
                public View getView(int position, View convertView, ViewGroup parent) {
                ImageView i = new ImageView(this.myContext);

                try {
                                /* Open a new URL and get the InputStream to load data from it. */
                                URL aURL = new URL(myRemoteImages[position]);
                                URLConnection conn = aURL.openConnection();
                                conn.connect();
                                InputStream is = conn.getInputStream();  
                                /* Buffered is always good for a performance plus. */
                                BufferedInputStream bis = new BufferedInputStream(is);
                                /* Decode url-data to a bitmap. */
                                Bitmap bm = BitmapFactory.decodeStream(bis);
                                bis.close();
                                is.close();

                                /* Apply the Bitmap to the ImageView that will be returned. */
                                i.setImageBitmap(bm);
                        } catch (IOException e) {

                                Log.e("DEBUGTAG", "Remtoe Image Exception", e);
                        }

                /* Image should be scaled as width/height are set. */
                i.setScaleType(ImageView.ScaleType.FIT_CENTER);
                /* Set the Width/Height of the ImageView. */
                i.setLayoutParams(new Gallery.LayoutParams(150, 150));
                return i;
                }

                /** Returns the size (0.0f to 1.0f) of the views
                * depending on the 'offset' to the center. */
                public float getScale(boolean focused, int offset) {
                /* Formula: 1 / (2 ^ offset) */
                return Math.max(0, 1.0f / (float)Math.pow(2, Math.abs(offset)));
                }
                }
            public class ImageAdapter2 extends BaseAdapter {
                /** The parent context */
                private Context myContext;public ImageAdapter2() {
                    // TODO Auto-generated constructor stub
                }
                /** URL-Strings to some remote images. */

                private String[] myRemoteImages = {imageUrl2};






                /** Simple Constructor saving the 'parent' context. */
                public ImageAdapter2(Context c) { this.myContext = c; }

                /** Returns the amount of images we have defined. */
                public int getCount() { return this.myRemoteImages.length; }

                /* Use the array-Positions as unique IDs */
                public Object getItem(int position) { return position; }
                public long getItemId(int position) { return position; }

                /** Returns a new ImageView to
                * be displayed, depending on
                * the position passed. */
                public View getView(int position, View convertView, ViewGroup parent) {
                ImageView i = new ImageView(this.myContext);

                try {
                                /* Open a new URL and get the InputStream to load data from it. */
                                URL aURL = new URL(myRemoteImages[position]);
                                URLConnection conn = aURL.openConnection();
                                conn.connect();
                                InputStream is = conn.getInputStream();  
                                /* Buffered is always good for a performance plus. */
                                BufferedInputStream bis = new BufferedInputStream(is);
                                /* Decode url-data to a bitmap. */
                                Bitmap bm = BitmapFactory.decodeStream(bis);
                                bis.close();
                                is.close();

                                /* Apply the Bitmap to the ImageView that will be returned. */
                                i.setImageBitmap(bm);
                        } catch (IOException e) {

                                Log.e("DEBUGTAG", "Remtoe Image Exception", e);
                        }

                /* Image should be scaled as width/height are set. */
                i.setScaleType(ImageView.ScaleType.FIT_CENTER);
                /* Set the Width/Height of the ImageView. */
                i.setLayoutParams(new Gallery.LayoutParams(150, 150));
                return i;
                }

                /** Returns the size (0.0f to 1.0f) of the views
                * depending on the 'offset' to the center. */
                public float getScale(boolean focused, int offset) {
                /* Formula: 1 / (2 ^ offset) */
                return Math.max(0, 1.0f / (float)Math.pow(2, Math.abs(offset)));




                }
}

}

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    在 AsyncTask 的 onPreExecute() 方法中获取 txt 文件。但在您执行此操作之前,请创建进度对话框并将其设置为.setCancelable(false)。在doInBackground() 中,获取图像……在onPostExecute() 中,执行一些 UI 工作,例如显示图像。

    编辑:

    protected class Somename extends AsyncTask<String, String, String>
        {
            public Somename()
            {           
    
            }
            @Override
            protected String doInBackground(String... arg0) {
    
                        // here you put the pure processings that DO NOT affect user-interface
                    getImages();  
                            getImage2();
    
                return null;
            }
    
            @Override
            protected void onPostExecute(String result) {
                ImageAdapter imgAdp = ImageAdapter(); //your constructor of the class that triggers updates on the UI
                super.onPostExecute(result);
            }       
        }
    

    当心发送正确的上下文,在你调用 INSIDE AsyncTask 类的方法中需要。并为您的 ImageAdapter 类创建构造函数以继承您从站点获取的数据。

    【讨论】:

    • 问题是图像在主 UI 中的图库中。问题是它在获取图像之前一直阻塞用户界面
    • 提取也可以在单独的线程中完成,只要您不在该线程中显示它们。因为您没有在 UI 上显示任何内容,而是在进行处理。
    • 我不明白,你说你有指向 imgs ina 文本文件的链接?
    • 我将文本文件托管在 Web 服务器上。当应用程序运行时,它会读取文本文档以获取字符串或 URL。 URL 每周都会更改。所以我将用更新的站点覆盖现有的 txt 文件。
    • 查看我上面的编辑。这些是我想在后台 AsyncTask 中运行的方法。
    猜你喜欢
    • 1970-01-01
    • 2014-10-07
    • 2016-02-10
    • 2016-12-30
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    相关资源
    最近更新 更多