Android හි ListView හි පින්තූර කම්මැලි කරන්නේ කෙසේද


1938

මම භාවිතා කරන්නේ a ListViewඑම රූප හා සම්බන්ධ සමහර පින්තූර සහ ශීර්ෂයන් ප්‍රදර්ශනය කිරීමට . මම අන්තර්ජාලයෙන් රූප ලබා ගන්නවා. කම්මැලි පැටවීමේ රූප සඳහා ක්‍රමයක් තිබේද, එම නිසා පෙළ දර්ශනය වන විට, UI අවහිර කර නොමැති අතර ඒවා බාගත වන විට රූප පෙන්වනු ලැබේ.

මුළු රූප ගණන ස්ථාවර නැත.



7
මම එය භාවිතා කර ඇත. එය අපූරු ක්‍රියාත්මක කිරීමකි. AsyncImageView විශාල ග්‍රීන් ඩ්‍රොයිඩ් ව්‍යාපෘතියක කොටසක් වන බවට නරක ආරංචියක් වන අතර එමඟින් ඔබට අවශ්‍ය වන්නේ AsyncImageView පමණි. ග්‍රීන්ඩ්‍රොයිඩ් ව්‍යාපෘතිය 2011 සිට යාවත්කාලීන නොවන බව පෙනේ.
borisstr

5
ඔබට මෙම පුස්තකාලය අත්හදා බැලීමට පවා හැකිය: ඇන්ඩ්‍රොයිඩ්-http-image-manager මගේ මතය අනුව අසමමුහුර්තව පැටවීම සඳහා හොඳම වේ.
රිටේෂ් කුමාර් ඩුබේ

34
පිකාසෝ භාවිතා කරන්න, එය සියල්ලම කරනු ඇත. 'Picasso.with (yourContext) .load (img src / path / drawable here) .ඉන්ටෝ (imageView එනම් ඔබේ ඉලක්කය);' ඒක තමයි!
අනුජ් ෂර්මා

7
භාවිතා කිරීමට උත්සාහ කරන්න: github.com/nostra13/Android-Universal-Image-Loader , මෙම පුස්තකාලය කම්මැලි පැටවීම සහ රූප
හැඹිලිය

Answers:


1090

මෙන්න මගේ යෙදුම දැනට පෙන්වන රූප රඳවා තබා ගැනීමට මා විසින් නිර්මාණය කරන ලද දේ මෙන්න. මෙහි භාවිතා වන "ලොග්" වස්තුව ඇන්ඩ්‍රොයිඩ් තුළ ඇති අවසාන ලොග් පන්තිය වටා මගේ අභිරුචි එතීම බව කරුණාවෙන් සලකන්න.

package com.wilson.android.library;

/*
 Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
*/
import java.io.IOException;

public class DrawableManager {
    private final Map<String, Drawable> drawableMap;

    public DrawableManager() {
        drawableMap = new HashMap<String, Drawable>();
    }

    public Drawable fetchDrawable(String urlString) {
        if (drawableMap.containsKey(urlString)) {
            return drawableMap.get(urlString);
        }

        Log.d(this.getClass().getSimpleName(), "image url:" + urlString);
        try {
            InputStream is = fetch(urlString);
            Drawable drawable = Drawable.createFromStream(is, "src");


            if (drawable != null) {
                drawableMap.put(urlString, drawable);
                Log.d(this.getClass().getSimpleName(), "got a thumbnail drawable: " + drawable.getBounds() + ", "
                        + drawable.getIntrinsicHeight() + "," + drawable.getIntrinsicWidth() + ", "
                        + drawable.getMinimumHeight() + "," + drawable.getMinimumWidth());
            } else {
              Log.w(this.getClass().getSimpleName(), "could not get thumbnail");
            }

            return drawable;
        } catch (MalformedURLException e) {
            Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
            return null;
        } catch (IOException e) {
            Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
            return null;
        }
    }

    public void fetchDrawableOnThread(final String urlString, final ImageView imageView) {
        if (drawableMap.containsKey(urlString)) {
            imageView.setImageDrawable(drawableMap.get(urlString));
        }

        final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message message) {
                imageView.setImageDrawable((Drawable) message.obj);
            }
        };

        Thread thread = new Thread() {
            @Override
            public void run() {
                //TODO : set imageView to a "pending" image
                Drawable drawable = fetchDrawable(urlString);
                Message message = handler.obtainMessage(1, drawable);
                handler.sendMessage(message);
            }
        };
        thread.start();
    }

    private InputStream fetch(String urlString) throws MalformedURLException, IOException {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpGet request = new HttpGet(urlString);
        HttpResponse response = httpClient.execute(request);
        return response.getEntity().getContent();
    }
}

104
ඔබේ වැඩසටහන කිසි විටෙකත් OutOfMemoryException වලට හේතු නොවන පරිදි ඔබ SoftReferences භාවිතා කළ යුතු යැයි මම සිතමි. ගොඩවල් ප්‍රමාණය වැඩි වන විට මෘදුකිරීම් ඉවත් කිරීමට GC හට හැකි බැවින් ... තත්පර කිහිපයකට පසු ඔබට ඔබේ පින්තූර එම ලැයිස්තුවට දැමිය හැකිය. පැටවීමට පෙර ඔබ පරීක්ෂා කර බැලිය යුතුය රූපය තිබේ නම් එය නැවත බාගත නොකර එකතු කරන්න එය එම ලැයිස්තුවෙන් ලබාගෙන එය නැවත ඔබේ මෘදුකාංග ලැයිස්තුවට ඇතුළත් කර ටික වේලාවකට පසු ඔබේ දෘඩ ලැයිස්තුව පිරිසිදු කළ හැකිය :)
AZ_

36
ගූගල් ෂෙල්ව්ස්
AZ_

12
ඇද ගත හැකි සිතියමේ රූපය අඩංගු වන විට ඔබට නැවත පැමිණීම මග හැරෙන්නේ නැද්ද ... ලබා ගැනීමේ නූල් ආරම්භ නොකර?
කරුසෙල්

5
මෙම කේතයට ගැටළු කිහිපයක් තිබේ. පළමුවෙන්ම ඔබ Drawables හැඹිලිගත කළ යුතුය, එය මතක කාන්දු වීමට හේතු වේ: stackoverflow.com/questions/7648740/… . දෙවනුව, හැඹිලිය කිසි විටෙකත් ඉවත් නොකෙරේ, එබැවින් එය සදහටම වර්ධනය වනු ඇත, එය තවත් මතක කාන්දුවකි.
satur9nine

10
ගැන අසා ඕනෑම එකක් නැත LRU Cache developer.android.com/training/displaying-bitmaps/...
මුහම්මද් Babar

1025

මම පින්තූර සහිත කම්මැලි ලැයිස්තුවක (GitHub හි පිහිටා ඇති) සරල නිරූපණයක් කළෙමි .

මූලික භාවිතය

ImageLoader imageLoader=new ImageLoader(context); ...
imageLoader.DisplayImage(url, imageView); 

ඔබගේ AndroidManifest.xml වෙත පහත සඳහන් අවසරයන් එක් කිරීමට අමතක නොකරන්න:

 <uses-permission android:name="android.permission.INTERNET"/>
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> Please

ImageLoader හි එක් අවස්ථාවක් පමණක් නිර්මාණය කර එය ඔබගේ යෙදුම වටා නැවත භාවිතා කරන්න. මේ ආකාරයෙන් රූප හැඹිලිය වඩාත් කාර්යක්ෂම වනු ඇත.

එය යමෙකුට ප්‍රයෝජනවත් විය හැකිය. එය පසුබිම් නූලෙන් රූප බාගත කරයි. පින්තූර SD කාඩ් පතක සහ මතකයේ තැන්පත් වේ. හැඹිලි ක්‍රියාත්මක කිරීම ඉතා සරල වන අතර එය නිරූපණය සඳහා පමණක් ප්‍රමාණවත් වේ. මතක පරිභෝජනය අඩු කිරීම සඳහා මම inSampleSize සමඟ රූප විකේතනය කරමි. ප්‍රතිචක්‍රීකරණය කළ අදහස් නිවැරදිව හැසිරවීමට මම උත්සාහ කරමි.

Alt පෙළ


7
ස්තූතියි, මම මගේ ව්‍යාපෘතියේ සෑම තැනකම පාහේ ඔබේ කේතයේ තරමක් වෙනස් කළ අනුවාදයක් භාවිතා කරමි: code.google.com/p/vimeoid/source/browse/apk/src/com/fedorvlasov/…
shaman.sir

3
විකල්පයක් ලෙස ගිලෙස් ඩෙබුන් විසින් කේතය දෙස කිසිවෙකු බැලුවාද? මා දකින විශාල වෙනස්කම් දෙක නම් 1) මතක හැඹිලි එදිරිව එස්ඩී කාඩ් පත සහ 2) නූල් තටාකයක් වෙනුවට අසින්ක් ටාස්ක් භාවිතා කිරීමයි. android-developers.blogspot.com/2010/07/…
රිචඩ්

4
දෝෂයක් ඇත, සමහර විට එය ඉවත් කරනු ලැබේ: 10-13 09: 58: 46.738: දෝෂය / ඇන්ඩ්‍රොයිඩ් ධාවන කාලය (24250): නොදන්නා හසුරුවන්නා: නොදැනුවත්වම ව්‍යතිරේකය හේතුවෙන් නූල් ප්‍රධාන පිටවීම 10-13 09: 58: 46.768: දෝෂය / ඇන්ඩ්‍රොයිඩ් ධාවන කාලය (24250) : java.lang. 58: 46.768: ERROR / AndroidRuntime (24250): java.util.Vector.get (Vector.java:445) 10-13 09: 58: 46.768: ERROR / AndroidRuntime (24250): com.my.app.image හි .ImageLoader $ PhotosQueue.Clean (ImageLoader.java:91)
Mikooos

65
මා වැනි නවකයින් සඳහා එක් කිරීමට මම කැමතියි ඔබට මෙම කේතය ඔබේම ව්‍යාපෘතියට එක් කිරීමට අවශ්‍ය නම්, ඔබ මැනිෆෙස්ටයේ බාහිර හැඹිලි අවසරයන් එක් කළ යුතුය. ස්තූතියි
ඇඩම්

2
Ru බ ru ස්හිල් නවතම ප්‍රභව කේතයේ ෆොටෝස්කිව් නොමැත. ඔබ ඉතා පැරණි අනුවාදයක් භාවිතා කරන බව පෙනේ.
ෆෙඩෝර්

552

මම නිර්දේශ කරන්නේ විවෘත කේත උපකරණයක් වන විශ්ව රූප පැටවුම . එය මුලින් පදනම් වී ඇත්තේ ෆෙඩෝර් ව්ලසොව්ගේ ලේසි ලිස්ට් ව්‍යාපෘතිය මත වන අතර එතැන් සිට එය බොහෝ සෙයින් වැඩිදියුණු කර ඇත.

  • බහු තෙරපුම් රූප පැටවීම
  • පුළුල් සුසර කිරීමේ හැකියාව ImageLoader හි වින්‍යාසය (නූල් ක්‍රියාත්මක කරන්නන්, ඩවුන්ලෝඩරය, විකේතකය, මතකය සහ තැටි හැඹිලිය, රූප විකල්ප පෙන්වීම සහ වෙනත්)
  • මතකයේ සහ / හෝ උපාංගයේ ගොනු පද්ධති (හෝ SD කාඩ්) මත පින්තූර හැඹිලි කිරීමේ හැකියාව
  • පැටවීමේ ක්‍රියාවලිය "සවන් දීමට" ඇති හැකියාව
  • වෙන්වූ විකල්ප සමඟ සෑම දර්ශන අනුරූප ඇමතුමක් රිසිකරණය කිරීමේ හැකියාව
  • විජට් සහාය
  • Android 2.0+ සහාය


16
ඔබ එහි නිර්මාතෘ විසින් ඔහුගේ වටිනා දරුවා ලෙස සලකන සහ නඩත්තු කරන විශිෂ්ට “රූප පැටවීමේ” කේතයක් සොයන්නේ නම් (එක් වරක් විසඳුමක් පමණක් නොවේ), ඔබ එය සොයා ගත්තේය; big up Nostra
AndroidGecko

ඇත්තෙන්ම විශිෂ්ට වැඩකි, නමුත් එය මගේ ලැයිස්තු දර්ශනයෙන් ටිකක් පසුගාමී වේ. ඔබට හොඳම කාර්ය සාධනය 'ImageLoader' ගොඩනැගීම පැවසිය හැකි නම් ... එසේත් නැතිනම් 'DisplayImageOptions' නිසා විය හැකිය.
dinigo

මම මෙම ජාල දර්ශනයට බෙහෙවින් ඇලුම් කරන නමුත් මගේ නිබන්ධනය සඳහා එය භාවිතා කළ නොහැක. මම ඇන්ඩ්‍රොයිඩ් වල ආරම්භකයෙක්. මම ග්‍රිඩ්වීව් ගැන අයදුම් කරන නමුත් මගේ යෙදුම targetSdkVersion 15 විය, එබැවින් පසුබිම් නූල්වල ක්‍රියාවලිය සඳහා මට අසින්ක්ටාස්ක් භාවිතා කළ යුතුය. මම මෙම ජාල දර්ශනය භාවිතා කළ නමුත් එය ක්‍රියාත්මක නොවේ. targetSdkVersion 15 හි එය භාවිතා කරන්නේ කෙසේද?
kongkea

ටැගය සමඟ ඔබට වෙනම ප්‍රශ්නයක් සෑදිය හැකිය [විශ්වීය-රූප-පැටවුම]
nostra13

3
නිල ඇන්ඩ්‍රොයිඩ් ලියකියවිලි කියවා මේ දේවල් මා විසින්ම කිරීමට උත්සාහ කිරීමෙන් පසුව, මෙම පුස්තකාලය සියල්ලම රූප පූරණය කිරීමේ අවසානය බව මට විශ්වාසයි. ප්‍රමාණවත් තරම් ඉහළ නැංවිය නොහැක.
Core

159

ගිලෙස් ඩෙබුන් විසින් රචිත නිබන්ධනයක් වන බහු කාර්ය සාධනය සඳහා කාර්ය සාධනය .

මෙය ඇන්ඩ්‍රොයිඩ් සංවර්ධකයින්ගේ බ්ලොග් අඩවියෙනි. යෝජිත කේතය භාවිතා කරන්නේ:

  • AsyncTasks.
  • , න, සීමිත ප්‍රමාණයක් , FIFO cache.
  • මෘදු, පහසුවෙන් garbage collectහැඹිලි හැඹිලියක්.
  • තැන් දරණුව Drawable ඔබට බාගත අතර.

රූප විස්තරය මෙහි ඇතුළත් කරන්න


10
එය 2.1 හි ද හොඳින් ක්‍රියාත්මක වේ. AndroidHttpClient භාවිතා නොකරන්න.
තෝමස් අහ්

2
@ thomas-ahle ස්තූතියි, AndroidHttpClient 2.2 සිට දෝෂ ලබා දෙන බව මම දුටුවෙමි, එය 2.2 සිට ක්‍රියාත්මක වන නමුත් එය ප්‍රතිස්ථාපනය කිරීමට වෙනත් දෙයක් සොයා ගැනීමට උත්සාහ කළේ නැත.
ඇඩීනියා

4
D ඇඩිනා ඔයා හරි, මට අමතක උනා. කෙසේ වෙතත් සාමාන්‍ය HttpClient සමඟ කළ හැකි කිසිවක් වට්ටෝරුවෙහි නොමැත.
තෝමස් අහ්

ඇන්ඩ්‍රොයිඩ් කර්නලය පද්ධතියේ පෙර සංස්කරණ සමඟ සසඳන විට මෙම යොමු එකතු කිරීමට ඉතා උනන්දුවෙන් සිටින නිසා ගූගල් මෘදු යොමු කිරීම් නිර්දේශ නොකරන බව මම ස්ථාන කිහිපයකින් අසා ඇත්තෙමි.
මුහම්මද් අහමඩ් අබුතාලිබ්

ඔයාට උදව් කරන්න පුළුවන්ද? stackoverflow.com/questions/62624070/…
ප්‍රියංකා සිං

109

යාවත්කාලීන කිරීම: මෙම පිළිතුර දැන් අකාර්යක්ෂම බව සලකන්න. කසළ එකතු කරන්නා සොෆ්ට් රීෆරන්ස් සහ දුර්වල යොමු කිරීම් මත ආක්‍රමණශීලීව ක්‍රියා කරයි, එබැවින් මෙම කේතය නව යෙදුම් සඳහා සුදුසු නොවේ. (ඒ වෙනුවට, වෙනත් පිළිතුරු වලින් යෝජනා කර ඇති විශ්ව රූප පූරණය වැනි පුස්තකාල උත්සාහ කරන්න .)

කේතය සඳහා ජේම්ස්ට සහ සොෆ්ට් රීෆරන්ස් භාවිතා කිරීමේ යෝජනාවට බාඕ-ලෝන්ග්ට ස්තූතියි. මම ජේම්ස්ගේ කේතයේ සොෆ්ට් රීෆරන්ස් වෙනස්කම් ක්‍රියාත්මක කළෙමි. අවාසනාවකට සොෆ්ට් රීෆරන්ස් මගේ පින්තූර ඉතා ඉක්මණින් කසළ එකතු කිරීමට හේතු විය. මගේ නඩුවේදී සොෆ්ට් රීෆරන්ස් දේවල් නොමැතිව එය හොඳයි, මන්ද මගේ ලැයිස්තු ප්‍රමාණය සීමිත වන අතර මගේ රූප කුඩා වේ.

ගූගල් කණ්ඩායම්වල සොෆ්ට් රීෆරන්ස් සම්බන්ධයෙන් මීට වසරකට පෙර සිට සාකච්ඡාවක් තිබේ: නූල් වලට සබැඳිය . ඉතා ඉක්මණින් කසළ එකතු කිරීමට විසඳුමක් ලෙස, ඔවුන් යෝජනා කරන්නේ මට එතරම් ආකර්ශනීය නොවන dalvik.system.VMRuntime.setMinimumHeapSize () භාවිතා කරමින් VM ගොඩවල් ප්‍රමාණය අතින් සැකසීමේ හැකියාවයි.

public DrawableManager() {
    drawableMap = new HashMap<String, SoftReference<Drawable>>();
}

public Drawable fetchDrawable(String urlString) {
    SoftReference<Drawable> drawableRef = drawableMap.get(urlString);
    if (drawableRef != null) {
        Drawable drawable = drawableRef.get();
        if (drawable != null)
            return drawable;
        // Reference has expired so remove the key from drawableMap
        drawableMap.remove(urlString);
    }

    if (Constants.LOGGING) Log.d(this.getClass().getSimpleName(), "image url:" + urlString);
    try {
        InputStream is = fetch(urlString);
        Drawable drawable = Drawable.createFromStream(is, "src");
        drawableRef = new SoftReference<Drawable>(drawable);
        drawableMap.put(urlString, drawableRef);
        if (Constants.LOGGING) Log.d(this.getClass().getSimpleName(), "got a thumbnail drawable: " + drawable.getBounds() + ", "
                + drawable.getIntrinsicHeight() + "," + drawable.getIntrinsicWidth() + ", "
                + drawable.getMinimumHeight() + "," + drawable.getMinimumWidth());
        return drawableRef.get();
    } catch (MalformedURLException e) {
        if (Constants.LOGGING) Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
        return null;
    } catch (IOException e) {
        if (Constants.LOGGING) Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
        return null;
    }
}

public void fetchDrawableOnThread(final String urlString, final ImageView imageView) {
    SoftReference<Drawable> drawableRef = drawableMap.get(urlString);
    if (drawableRef != null) {
        Drawable drawable = drawableRef.get();
        if (drawable != null) {
            imageView.setImageDrawable(drawableRef.get());
            return;
        }
        // Reference has expired so remove the key from drawableMap
        drawableMap.remove(urlString);
    }

    final Handler handler = new Handler() {
        @Override
        public void handleMessage(Message message) {
            imageView.setImageDrawable((Drawable) message.obj);
        }
    };

    Thread thread = new Thread() {
        @Override
        public void run() {
            //TODO : set imageView to a "pending" image
            Drawable drawable = fetchDrawable(urlString);
            Message message = handler.obtainMessage(1, drawable);
            handler.sendMessage(message);
        }
    };
    thread.start();
}

3
දෘ hard පරම්පරාව සහ මෘදු කිරීම වැනි පරම්පරාවන් ඔබට නිර්මාණය කළ හැකිය. තත්පර 3 කින් ප්‍රවේශ නොවූ සියලුම පින්තූර ඉවත් කිරීමට ඔබට පැහැදිලි වේලාවක් තිබේ .. ඔබට ගූගල් රාක්ක ව්‍යාපෘතිය දෙස බැලිය හැකිය
AZ_

සංවර්ධක . බොහෝ යෙදුම් මෘදු යොමු කිරීම් වෙනුවට android.util.LruCache භාවිතා කළ යුතුය.
vokilam

මම ඔබේ කේතය අගය කරමි, නමුත් දැන් නව ඇන්ඩ්‍රොයිඩ් ඕ / එස් ​​හි 'ආක්‍රමණශීලී' කසළ එකතු කිරීමක් ඇත. දුර්වල සඳහනක් පැවැත්වීම මට තේරුමක් නැත.
j2emanue

answer j2emanue ඔබ නිවැරදියි, මගේ පිළිතුරේ ඉහළින්ම දැක්වීමට මම උත්සාහ කළ පරිදි, සොෆ්ට් රීෆරන්ස් යනු ඉක්මනින් එකතු කරන කසළ වේ. එය වඩාත් පැහැදිලි කිරීම සඳහා මම මෙම පිළිතුර සංස්කරණය කිරීමට උත්සාහ කරමි.
TalkLittle

97

පිකාසෝ

ජේක් වෝර්ටන්ගේ පිකාසෝ පුස්තකාලය භාවිතා කරන්න. (පරිපූර්ණ රූප ලෝඩින් පුස්තකාලයක් ඇක්ෂන්බාර්ෂර්ලොක් හි සංවර්ධකයා සාදයි)

ඇන්ඩ්‍රොයිඩ් සඳහා පුස්තකාලයක් බාගත කිරීම සහ හැඹිලිගත කිරීම.

පින්තූර ඇන්ඩ්‍රොයිඩ් යෙදුම් සඳහා අවශ්‍ය සන්දර්භය සහ දෘශ්‍ය දස්කම් එක් කරයි. ඔබේ යෙදුමේ කරදරයකින් තොර රූප පැටවීමට පිකාසෝ ඉඩ දෙයි - බොහෝ විට එක් කේත පේළියක!

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

ඇන්ඩ්‍රොයිඩ් හි රූප පැටවීමේ බොහෝ පොදු අන්තරායන් ස්වයංක්‍රීයව හසුරුවනු ලබන්නේ පිකාසෝ විසිනි:

ImageView ප්‍රතිචක්‍රීකරණය හැසිරවීම සහ ඇඩැප්ටරයක බාගත අවලංගු කිරීම. අවම මතක භාවිතය සහිත සංකීර්ණ රූප පරිවර්තනයන්. ස්වයංක්‍රීය මතකය සහ තැටි හැඹිලිය.

පිකාසෝ ජේක් වෝර්ටන්ගේ පුස්තකාලය

ග්ලයිඩය

ග්ලයිඩය යනු ඇන්ඩ්‍රොයිඩ් සඳහා වේගවත් හා කාර්යක්ෂම විවෘත මූලාශ්‍ර මාධ්‍ය කළමනාකරණ රාමුවක් වන අතර එය මාධ්‍ය විකේතනය, මතකය සහ තැටි හැඹිලි සහ සම්පත් එක්රැස් කිරීම සරල හා පහසුවෙන් භාවිතා කළ හැකි අතුරු මුහුණතක් බවට පත් කරයි.

ග්ලයි ide ් වීඩියෝ දර්ශන, රූප සහ සජීවිකරණ ජීඅයිඑෆ් ලබා ගැනීම, විකේතනය කිරීම සහ ප්‍රදර්ශනය කිරීම සඳහා සහාය වේ. ග්ලයිඩයට නම්යශීලී api ඇතුළත් වන අතර එමඟින් ඕනෑම ජාල ගබඩාවකට පාහේ පිවිසීමට සංවර්ධකයින්ට ඉඩ ලබා දේ. පෙරනිමියෙන් ග්ලයිඩ් අභිරුචි HttpUrlConnection පදනම් කරගත් තොගයක් භාවිතා කරයි, නමුත් උපයෝගිතා පුස්තකාල ද ගූගල් වොලි ව්‍යාපෘතියට හෝ ඒ වෙනුවට චතුරස්රයේ OkHttp පුස්තකාලයට ඇතුළත් කර ඇත.

Glide.with(this).load("http://goo.gl/h8qOq7").into(imageView);

ග්ලයිඩයේ මූලික අවධානය යොමු වී ඇත්තේ ඕනෑම ආකාරයක පින්තූර ලැයිස්තුවක් හැකි තරම් සුමට හා වේගවත් කිරීම සඳහා ය, නමුත් දුරස්ථ රූපයක් ලබා ගැනීමට, ප්‍රමාණය වෙනස් කිරීමට සහ ප්‍රදර්ශනය කිරීමට අවශ්‍ය ඕනෑම අවස්ථාවක ග්ලයිඩය effective ලදායී වේ.

පින්තූර පූරණය කිරීමේ පුස්තකාලය ග්ලයිඩ් කරන්න

ෆේස්බුක් විසින් බිතු සිතුවම්

ෆ්‍රෙස්කෝ යනු ඇන්ඩ්‍රොයිඩ් යෙදුම්වල රූප පෙන්වීම සඳහා ප්‍රබල පද්ධතියකි.

පින්තූර පැටවීම සහ දර්ශනය කිරීම ගැන ෆ්‍රෙස්කෝ බලා ගනී, එබැවින් ඔබට එසේ කිරීමට අවශ්‍ය නැත. එය ජාලයෙන්, දේශීය ආචයනයෙන් හෝ දේශීය සම්පත් වලින් රූප පූරණය කරන අතර රූපය පැමිණෙන තෙක් ස්ථාන දරන්නා පෙන්වනු ඇත. එය හැඹිලි මට්ටම් දෙකක් ඇත; එකක් මතකයේ සහ තවත් එකක් අභ්‍යන්තර ගබඩාවේ.

ෆ්‍රෙස්කෝ ගිතුබ්

ඇන්ඩ්‍රොයිඩ් 4.x සහ ඊට පහළින්, ෆ්‍රෙස්කෝ විසින් ඇන්ඩ්‍රොයිඩ් මතකයේ විශේෂ කලාපයක පින්තූර තබයි. මෙය ඔබගේ යෙදුම වේගයෙන් ධාවනය කිරීමට ඉඩ සලසයි - සහ භයානක OutOfMemoryError වලට වඩා අඩුවෙන් පීඩා විඳින්න.

බිතු සිතුවම්


පිකාසෝ යනු චතුරස්රය
ලෝඩ් රේඩන් එම්කේ විසින්

83

ඉහළ කාර්ය සාධන පැටවුම - මෙහි යෝජනා කර ඇති ක්‍රම පරීක්ෂා කිරීමෙන් පසුව, මම බෙන්ගේ විසඳුම සමහර වෙනස්කම් සමඟ භාවිතා කළෙමි -

  1. ලාච්චු සමඟ වැඩ කිරීම වේගවත් බව මම තේරුම් ගත්තා බිට්මැප් සමඟ ඒ නිසා මම ඒ වෙනුවට ලාච්චු භාවිතා කරමි

  2. සොෆ්ට් රීෆරන්ස් භාවිතා කිරීම විශිෂ්ටයි, නමුත් එය හැඹිලි රූපය බොහෝ විට මකා දැමීමට සලස්වයි, එබැවින් මම පින්තූර ලැයිස්තුවක් ඇති සම්බන්ධිත ලැයිස්තුවක් එක් කළෙමි.

  3. InputStream විවෘත කිරීම සඳහා මම වෙබ් හැඹිලිය භාවිතා කිරීමට ඉඩ සලසන java.net.URLConnection භාවිතා කළෙමි (ඔබට පළමුව ප්‍රතිචාර හැඹිලියක් සැකසිය යුතුය, නමුත් එය තවත් කතාවකි)

මගේ කේතය:

import java.util.Map; 
import java.util.HashMap; 
import java.util.LinkedList; 
import java.util.Collections; 
import java.util.WeakHashMap; 
import java.lang.ref.SoftReference; 
import java.util.concurrent.Executors; 
import java.util.concurrent.ExecutorService; 
import android.graphics.drawable.Drawable;
import android.widget.ImageView;
import android.os.Handler;
import android.os.Message;
import java.io.InputStream;
import java.net.MalformedURLException; 
import java.io.IOException; 
import java.net.URL;
import java.net.URLConnection;

public class DrawableBackgroundDownloader {    

private final Map<String, SoftReference<Drawable>> mCache = new HashMap<String, SoftReference<Drawable>>();   
private final LinkedList <Drawable> mChacheController = new LinkedList <Drawable> ();
private ExecutorService mThreadPool;  
private final Map<ImageView, String> mImageViews = Collections.synchronizedMap(new WeakHashMap<ImageView, String>());  

public static int MAX_CACHE_SIZE = 80; 
public int THREAD_POOL_SIZE = 3;

/**
 * Constructor
 */
public DrawableBackgroundDownloader() {  
    mThreadPool = Executors.newFixedThreadPool(THREAD_POOL_SIZE);  
}  


/**
 * Clears all instance data and stops running threads
 */
public void Reset() {
    ExecutorService oldThreadPool = mThreadPool;
    mThreadPool = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
    oldThreadPool.shutdownNow();

    mChacheController.clear();
    mCache.clear();
    mImageViews.clear();
}  

public void loadDrawable(final String url, final ImageView imageView,Drawable placeholder) {  
    mImageViews.put(imageView, url);  
    Drawable drawable = getDrawableFromCache(url);  

    // check in UI thread, so no concurrency issues  
    if (drawable != null) {  
        //Log.d(null, "Item loaded from mCache: " + url);  
        imageView.setImageDrawable(drawable);  
    } else {  
        imageView.setImageDrawable(placeholder);  
        queueJob(url, imageView, placeholder);  
    }  
} 


private Drawable getDrawableFromCache(String url) {  
    if (mCache.containsKey(url)) {  
        return mCache.get(url).get();  
    }  

    return null;  
}

private synchronized void putDrawableInCache(String url,Drawable drawable) {  
    int chacheControllerSize = mChacheController.size();
    if (chacheControllerSize > MAX_CACHE_SIZE) 
        mChacheController.subList(0, MAX_CACHE_SIZE/2).clear();

    mChacheController.addLast(drawable);
    mCache.put(url, new SoftReference<Drawable>(drawable));

}  

private void queueJob(final String url, final ImageView imageView,final Drawable placeholder) {  
    /* Create handler in UI thread. */  
    final Handler handler = new Handler() {  
        @Override  
        public void handleMessage(Message msg) {  
            String tag = mImageViews.get(imageView);  
            if (tag != null && tag.equals(url)) {
                if (imageView.isShown())
                    if (msg.obj != null) {
                        imageView.setImageDrawable((Drawable) msg.obj);  
                    } else {  
                        imageView.setImageDrawable(placeholder);  
                        //Log.d(null, "fail " + url);  
                    } 
            }  
        }  
    };  

    mThreadPool.submit(new Runnable() {  
        @Override  
        public void run() {  
            final Drawable bmp = downloadDrawable(url);
            // if the view is not visible anymore, the image will be ready for next time in cache
            if (imageView.isShown())
            {
                Message message = Message.obtain();  
                message.obj = bmp;
                //Log.d(null, "Item downloaded: " + url);  

                handler.sendMessage(message);
            }
        }  
    });  
}  



private Drawable downloadDrawable(String url) {  
    try {  
        InputStream is = getInputStream(url);

        Drawable drawable = Drawable.createFromStream(is, url);
        putDrawableInCache(url,drawable);  
        return drawable;  

    } catch (MalformedURLException e) {  
        e.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    }  

    return null;  
}  


private InputStream getInputStream(String urlString) throws MalformedURLException, IOException {
    URL url = new URL(urlString);
    URLConnection connection;
    connection = url.openConnection();
    connection.setUseCaches(true); 
    connection.connect();
    InputStream response = connection.getInputStream();

    return response;
}
}

නියමයි! BTW පන්තියේ නාමයේ අක්ෂර වින්‍යාසයක් ඇත.
මුලින්ස්

5
එය වෙනත් කෙනෙකුගේ කාලය ඉතිරි කරන්නේ නම්: import java.util.Map; import java.util.HashMap; import java.util.LinkedList; import java.util.Collections; import java.util.WeakHashMap; import java.lang.ref.SoftReference; import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; import android.graphics.drawable.Drawable; import android.widget.ImageView; import android.os.Handler; import android.os.Message; import java.io.InputStream; import java.net.MalformedURLException; import java.io.IOException; import java.net.URL; import java.net.URLConnection;
මයිකල් රීඩ්

බොහොම ස්තූතියි, මෙය කදිම ක්‍රියාත්මක කිරීමකි. ඇඳිය හැකි දේ පටවන විට මම වෙනත් ස්ථාන දරන්නෙකු ද තබමි, එවිට පරිශීලකයාට යම් ප්‍රතිපෝෂණයක් ලබා ගත හැකිය.
ජුවාන් හර්නාන්ඩස්

සුපුරුදු FIFO වෙනුවට ක්‍රියාත්මක කිරීමේ සේවාවේ (mThreadPool) LIFO පෝලිමක් භාවිතා කිරීම වඩා හොඳ යැයි මම සිතමි, එබැවින් ඉල්ලූ අවසන් පින්තූර (දෘශ්‍යමාන ඒවා විය හැක) පළමුව පටවනු ලැබේ. Stackoverflow.com/questions/4620061/how-to-create-lifo-executor
ජුවාන් හර්නාන්ඩස්

9
Ic මයිකල් රීඩ්, ඔබ සූර්යග්‍රහණ පරිශීලකයෙක් නම්, මම නිර්දේශ කරන්නේ Ctrl-Shift-O භාවිතා කිරීමයි (එය O අකුර මිස අංක 0 නොවේ). එය ආනයන එකතු කිරීමේ ක්‍රියාවලිය ස්වයංක්‍රීය කරන අතර ඒවා ඔබ වෙනුවෙන් සංවිධානය කරයි. ඔබ මැක්හි සිටී නම්, ඒ වෙනුවට Command-Shift-O භාවිතා කරන්න.
සිලිත්ක්‍රෝව්

78

මම මෙම ඇන්ඩ්‍රොයිඩ් පුහුණුව අනුගමනය කර ඇති අතර ප්‍රධාන UI අවහිර නොකර රූප බාගත කිරීමේදී එය විශිෂ්ට කාර්යයක් කරනු ඇතැයි මම සිතමි. එය බොහෝ පින්තූර හරහා අනුචලනය කිරීම හා හැසිරවීම හසුරුවයි: විශාල බිට්මැප් කාර්යක්ෂමව පූරණය කිරීම


මට කණගාටුයි, මම ගූගල් අයිඕ යෙදුම සඳහා එක් පන්තියකට පමණක් යොමු කළෙමි (මම සංස්කරණය කිරීමට ප්‍රමාද වැඩිය). හැඹිලි පන්තියට සමාන පැකේජයකින් ඔබට සොයාගත හැකි ඔවුන්ගේ රූප පැටවීම සහ හැඹිලි උපයෝගිතා පන්ති සියල්ල ඔබ සැබවින්ම අධ්‍යයනය කළ යුතුය .
mkuech

ලැයිස්තු දර්ශනය සඳහා රූප පැටවීම / හැඹිලි හැසිරවීමට උදව් කිරීම සඳහා iosched යෙදුමේ උපයෝගීතා ෆෝල්ඩරයෙන් DiskLruCache, Image * .java ගොනු ලබා ගැනීමට යමෙක් නිර්දේශ කරයිද? මම අදහස් කළේ මෙම විෂය පිළිබඳ සබැඳි සංවර්ධක මාර්ගෝපදේශ අනුගමනය කිරීම අනිවාර්යයෙන්ම වටින නමුත් මෙම පංති (අයෝෂ්ඩ් සිට) රටාව සමඟ තව ටිකක් ඉදිරියට යන්න.
ගෞතම්

65

1. ඔබේ යෙදුමේ කරදරයකින් තොර රූප පැටවීමට පිකාසෝ ඉඩ දෙයි - බොහෝ විට එක් කේත පේළියක!

Gradle භාවිතා කරන්න:

implementation 'com.squareup.picasso:picasso:2.71828'

එක් කේත පේළියක් පමණි!

Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView);

2. ග්ලයිඩය ඇන්ඩ්‍රොයිඩ් සඳහා රූප පැටවීම සහ හැඹිලි පුස්තකාලය සුමට අනුචලනය කෙරෙහි අවධානය යොමු කරයි

Gradle භාවිතා කරන්න:

repositories {
  mavenCentral() 
  google()
}

dependencies {
   implementation 'com.github.bumptech.glide:glide:4.7.1'
   annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
}

// සරල දර්ශනයක් සඳහා:

  Glide.with(this).load("http://i.imgur.com/DvpvklR.png").into(imageView);

3. ෆ්‍රෙස්කෝ යනු ඇන්ඩ්‍රොයිඩ් යෙදුම්වල පින්තූර ප්‍රදර්ශනය කිරීම සඳහා ප්‍රබල පද්ධතියකි . ෆ්‍රෙස්කෝ විසින් රූප පැටවීම සහ දර්ශනය ගැන සැලකිලිමත් වන බැවින් ඔබට එසේ කිරීමට අවශ්‍ය නැත.

බිතු සිතුවම් සමඟ ආරම්භ කිරීම


මෙම නිබන්ධනය ඔබට PICASOO සඳහා තවත් උදව් වනු ඇත: - androidtutorialshub.com/… සහ GLIDE: - androidtutorialshub.com/…
vasan

52

ලැයිස්තු දර්ශනයක පින්තූර කම්මැලි ලෙස පැටවීම කරන්නේ කෙසේද යන්න පැහැදිලි කරන නිබන්ධනයක් මා ලියා ඇත. ප්‍රතිචක්‍රීකරණය සහ සමගාමී මුදල් පිළිබඳ කරුණු පිළිබඳව මම සවිස්තරාත්මකව සොයා බලමි. නූල් විශාල ප්‍රමාණයක් ඇතිවීම වැළැක්වීම සඳහා මම ස්ථාවර නූල් තටාකයක් ද භාවිතා කරමි.

ලැයිස්තු දර්ශන නිබන්ධනයේ රූප අලස ලෙස පැටවීම


41

මම එය කරන ආකාරය වන්නේ පසුබිමෙහි ඇති පින්තූර බාගත කිරීම සඳහා නූල් දියත් කිරීම සහ එක් එක් ලැයිස්තු අයිතම සඳහා ඇමතුමක් ලබා දීමයි. පින්තූරයක් බාගත කිරීම අවසන් වූ විට එය ඇමතුම් ලබා ගන්නා අතර එය ලැයිස්තු අයිතමය සඳහා දර්ශනය යාවත්කාලීන කරයි.

කෙසේ වෙතත් ඔබ අදහස් ප්‍රතිචක්‍රීකරණය කරන විට මෙම ක්‍රමය හොඳින් ක්‍රියාත්මක නොවේ.


සෑම රූපයක් සඳහාම නූල් භාවිතා කිරීම මා භාවිතා කරන ප්‍රවේශයයි. ඔබ ඔබේ ආකෘතිය ඔබේ දෘෂ්ටියෙන් වෙන් කරන්නේ නම්, ක්‍රියාකාරකමෙන් පිටත (ඔබේ 'යෙදුම්' පන්තියේ මෙන්) ඒවා හැඹිලි තබා ගැනීමට ඔබට හැකිය. ඔබට බොහෝ පින්තූර තිබේ නම් සම්පත් හිඟ වීමෙන් පරිස්සම් වන්න.
ජේම්ස් ඒ විල්සන්

කරුණාකර විස්තාරණය කළ හැකිද? මම ඇන්ඩ්‍රොයිඩ් සංවර්ධනයට අලුත් ය. ඉඟි වලට ස්තූතියි
lostInTransit

14
සෑම රූපයක් සඳහාම නව නූලක් ආරම්භ කිරීම solution ලදායී විසඳුමක් නොවේ. ඔබට මතකයේ ඇති නූල් සහ කැටි UI සමඟ අවසන් විය හැකිය.
ෆෙඩෝර්

ෆෙඩෝර්, එකඟයි, මම සාමාන්‍යයෙන් පෝලිමක් සහ නූල් තටාකයක් භාවිතා කරමි, එය ඉමෝ යන්න හොඳම ක්‍රමයයි.
jasonhudgins

32

මට තවත් හොඳ උදාහරණයක් එක් කිරීමට අවශ්‍යයි, XML ඇඩැප්ටර . එය ගූගල් විසින් භාවිතා කරන බැවින් මමත් OutOfMemory දෝෂයක් වළක්වා ගැනීම සඳහා එකම තර්කනය භාවිතා කරමි.

මූලික වශයෙන් මෙම ImageDownloader ඔබේ පිළිතුරයි (එය ඔබගේ බොහෝ අවශ්‍යතා ආවරණය කරන බැවින්). සමහර ඒවා ඔබට ක්‍රියාත්මක කළ හැකිය.


2
ImageDownloader පන්තියට අනුකූල නොවේ: code.google.com/p/parleys-android-nextgen/issues/detail?id=1
සෑම්

29

මෙය ඇන්ඩ්‍රොයිඩ් හි පොදු ගැටළුවක් වන අතර එය බොහෝ අය විසින් විවිධාකාරයෙන් විසඳා ඇත. මගේ මතය අනුව මා දුටු හොඳම විසඳුම වන්නේ පිකාසෝ නම් නව පුස්තකාලයයි . මෙන්න විශේෂ අවස්ථා:

  • විවෘත මූලාශ්ර, නමුත් විසින් නායකත්වය Jake Whartonපිළිබඳ ActionBarSherlock ගැනුනි.
  • එක් කේත පේළියක් සමඟ ජාල හෝ යෙදුම් සම්පත් වලින් අසමමුහුර්තව පටවන්න
  • ස්වයංක්‍රීයව ListViewඅනාවරණය කර ගැනීම
  • ස්වයංක්‍රීය තැටිය සහ මතක හැඹිලිය
  • අභිරුචි පරිවර්තනයන් කළ හැකිය
  • වින්‍යාසගත කළ හැකි විකල්ප ගොඩක්
  • සුපිරි සරල API
  • නිතර යාවත්කාලීන වේ

29

මම නව ඇන්ඩ්‍රොයිඩ් වොලි පුස්තකාලයෙන් NetworkImageView භාවිතා කර ඇති com.android.volley.toolbox.NetworkImageViewඅතර එය ඉතා හොඳින් ක්‍රියාත්මක වන බව පෙනේ. පෙනෙන විදිහට, මෙය ගූගල් ප්ලේ සහ වෙනත් නව ගූගල් යෙදුම්වල භාවිතා කරන එකම මතයයි . පරීක්ෂා කිරීම අනිවාර්යයෙන්ම වටී.


1
මම මේ හොඳම විසඳුම සිතන්න - අනෙක් පිළිතුරු ඉතා පැරණි - වොලිබෝල් මුලු රටටම සෙතක් ඉතා ඉක්මනින් සහ Jake warthons සමග ඒකාබද්ධ එහි ඇති perfekt විසඳුමක් disklrucache - i අන් අය ගොඩක් උත්සාහ කළා නමුත් එක් ස්ථායී සහ වේගවත් වොලිබෝල් පරිදි වේ
ඇලෙක්සැන්ඩර් Sidikov Pfeif

26

හොඳයි, අන්තර්ජාලයෙන් රූප පැටවීමේ කාලය බොහෝ විසඳුම් ඇත. ඔබට පුස්තකාලය ඇන්ඩ්‍රොයිඩ් විමසුම භාවිතා කළ හැකිය . එය ඔබට අවශ්‍ය සියලු ක්‍රියාකාරකම් ලබා දෙනු ඇත. ඔබට කිරීමට අවශ්‍ය දේ සහතික කර පුස්තකාල විකී පිටුව කියවන්න. රූප පැටවීමේ සීමාව විසඳන්න.

මෙය මගේ කේතයයි:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.row, null);
    }

    ImageView imageview = (ImageView) v.findViewById(R.id.icon);
    AQuery aq = new AQuery(convertView);

    String imageUrl = "http://www.vikispot.com/z/images/vikispot/android-w.png";

    aq.id(imageview).progress(this).image(imageUrl, true, true, 0, 0, new BitmapAjaxCallback() {
        @Override
        public void callback(String url, ImageView iv, Bitmap bm, AjaxStatus status) {
            iv.setImageBitmap(bm);
        }
    ));

    return v;
}

එය ඔබගේ කම්මැලි පැටවීමේ ගැටළුව විසඳිය යුතුය.


මට සතුටක්, නමුත් ඔබේ ව්‍යාපෘතියට ඇතුළත් කිරීමට ජාර් ගොනුවක් අවශ්‍යයි. ඔබට එම JAR ගොනුව මෙතැනින් බාගත හැකිය AQuery androidAQuery = නව AQuery (මෙය); link Is: code.google.com/archive/p/android-query/downloads
සෙලීම් රාසා

25

මම හිතන්නේ මෙම ගැටළුව ඇන්ඩ්‍රොයිඩ් සංවර්ධකයින් අතර ඉතා ජනප්‍රිය වන අතර, මෙම ගැටළුව විසඳන බව කියා සිටින එවැනි පුස්තකාල ඕනෑ තරම් තිබේ, නමුත් ඒවායින් කිහිපයක් පමණක් සලකුණු කර ඇති බව පෙනේ. AQuery යනු එවැනි එක් පුස්තකාලයකි, නමුත් එය සෑම අංශයකින්ම ඒවාට වඩා හොඳ වන අතර එය උත්සාහ කිරීම වටී.


22

ඔබ උත්සාහ කළ යුතුයි මෙම විශ්ව පැටවුම හොඳම. කම්මැලි පැටවීම පිළිබඳ බොහෝ RnD කළ පසු මම මෙය භාවිතා කරමි.

විශ්ව රූප පැටවුම

විශේෂාංග

  • බහු තෙරපුම් රූප පැටවීම (අසින්ක් හෝ සමමුහුර්තකරණය)
  • ImageLoader හි වින්‍යාසය පුළුල් ලෙස අභිරුචිකරණය කිරීම (නූල් ක්‍රියාත්මක කරන්නන්, බාගත කරන්නා, විකේතකය, මතකය සහ තැටි හැඹිලිය, රූප විකල්ප පෙන්වීම ආදිය)
  • සෑම දර්ශන රූප ඇමතුමක් සඳහාම බොහෝ අභිරුචිකරණ විකල්ප (මුර රූප, හැඹිලි ස්විචය, විකේතනය කිරීමේ විකල්ප, බිට්මැප් සැකසීම සහ ප්‍රදර්ශනය කිරීම ආදිය)
  • පින්තූර හැඹිලිය මතකයේ සහ / හෝ තැටියේ (උපාංගයේ ගොනු පද්ධතිය හෝ SD කාඩ්)
  • පැටවීමේ ක්‍රියාවලියට සවන්දීම (බාගත කිරීමේ ප්‍රගතිය ඇතුළුව)

Android 2.0+ සහාය

රූප විස්තරය මෙහි ඇතුළත් කරන්න


20

ෂටර්බග් දෙස බලන්න , Applidium ගේ සැහැල්ලු SDWebImage (iOS මත ලස්සන පුස්තකාලය) ඇන්ඩ්රොයිඩ් සඳහා වරාය. එය අසමමුහුර්ත හැඹිලි සඳහා සහය දක්වයි, අසාර්ථක URL ගබඩා කරයි, සමගාමී මුදල් හොඳින් හසුරුවයි, සහ ප්‍රයෝජනවත් උප පංති ඇතුළත් වේ.

අදින්න ඉල්ලීම් (සහ දෝෂ වාර්තා) ද සාදරයෙන් පිළිගනිමු!


16

DroidParts හි ImageFetcher ඇති අතර එය ආරම්භ කිරීමට ශුන්‍ය වින්‍යාසයක් අවශ්‍ය වේ.

  • තැටියක් සහ මතකයේ අවම වශයෙන් මෑතකදී භාවිතා කරන ලදි (LRU) හැඹිලිය භාවිතා කරයි.
  • රූප කාර්යක්ෂමව විකේතනය කරයි.
  • පසුබිම් නූල් වල බිට්මැප් වෙනස් කිරීමට සහය දක්වයි.
  • සරල හරස්-ෆේඩ් ඇත.
  • පින්තූර පැටවීමේ ප්‍රගතිය නැවත කැඳවීමක් ඇත.

උදාහරණයක් ලෙස ක්ලෝන ඩ්‍රොයිඩ්පාර්ට්ස්ග්‍රෑම් :

රූප විස්තරය මෙහි ඇතුළත් කරන්න


හායි, මම කේත උදාහරණ දෙස බැලුවෙමි, නමුත් මට ArrayAdapter සමඟ ImageFetcher භාවිතා කිරීමේ ගැටළු තිබේ, ඔබ මගේ ප්‍රශ්නය දෙස බැලීමට කැමතිද? stackoverflow.com/questions/21089147/… ස්තූතියි =]
මාෂා

16

කම්මැලි පටවන රූප සඳහා කුමන පුස්තකාලය භාවිතා කළ යුතුද යන්න පිළිබඳව අවිනිශ්චිතතාවයකින් පෙළෙන අයෙකුට ඉක්මන් ඉඟියක්:

මූලික ක්‍රම හතරක් ඇත.

  1. DIY => හොඳම විසඳුම නොව රූප කිහිපයක් සඳහා වන අතර ඔබට වෙනත් පුස්තකාල භාවිතා කිරීමේ කරදරයකින් තොරව යාමට අවශ්‍ය නම්

  2. වොලීගේ කම්මැලි පූරණය වන පුස්තකාලය => android හි සිටින පුද්ගලයින්ගෙන්. එය හොඳයි සහ සෑම දෙයක්ම නමුත් දුර්වල ලෙස ලේඛනගත කර ඇති අතර එබැවින් භාවිතා කිරීම ගැටළුවක්.

  3. පිකාසෝ: සරල විසඳුමක්, ඔබට ගෙන ඒමට අවශ්‍ය රූප ප්‍රමාණය පවා නියම කළ හැකිය. එය භාවිතා කිරීම ඉතා සරල නමුත් විශාල ප්‍රමාණයේ පින්තූර සමඟ කටයුතු කළ යුතු යෙදුම් සඳහා “ක්‍රියාකාරී” නොවිය හැකිය.

  4. UIL: කම්මැලි පැටවීමේ රූප සඳහා හොඳම ක්‍රමය. ඔබට පින්තූර හැඹිලිගත කළ හැකිය (ඔබට ඇත්ත වශයෙන්ම අවසර අවශ්‍යයි), පැටවුම එක් වරක් ආරම්භ කරන්න, ඉන්පසු ඔබේ වැඩ කටයුතු කරගෙන යන්න. මම මෙතෙක් දැක ඇති වඩාත්ම පරිණත අසමමුහුර්ත රූප පැටවීමේ පුස්තකාලය.


15

නොවෝඩා සතුව විශාල කම්මැලි රූප පැටවීමේ පුස්තකාලයක් ඇති අතර සොන්ග්කික්, පොඩියෝ, සීක්‍රට් ඩීජේ සහ ඉමේජ් සෙවුම් වැනි බොහෝ යෙදුම් ඔවුන්ගේ පුස්තකාලය භාවිතා කරයි.

ඔවුන්ගේ පුස්තකාලය මෙහි ගිතුබ් හි සත්කාරකත්වය දරන අතර ඔවුන්ට ඉතා ක්‍රියාකාරී ගැටළු සොයාගැනීමේ යන්ත්‍රයක් ද ඇත. ඔවුන්ගේ පිළිතුර ද ඉතා ක්‍රියාකාරී බව පෙනේ, මෙම පිළිතුර ලිවීමේදී 300+ කට වඩා වැඩි ප්‍රමාණයක් සිදු වේ.


1
ඇත්ත වශයෙන්ම නොවෝඩා විශිෂ්ට පුස්තකාලයක් නමුත් ... සමහර විට ඔබට විශාල පුස්තකාලයක් අවශ්‍ය නොවන අතර විසඳුමේ සරල ප්‍රවේශයක් පමණි. ගිතුබ් හි ලේසිලිස්ට් ඉතා හොඳ වන්නේ එබැවිනි, ඔබගේ යෙදුම් ලැයිස්තුවක් තුළ රූපයක් පෙන්වන්නේ නම් සහ එය ඔබගේ යෙදුමේ ප්‍රධාන ලක්ෂණය නොවේ නම්, මම සැහැල්ලු දෙයක් භාවිතා කිරීමට කැමති තවත් ක්‍රියාකාරකමක්. එසේ නොමැතිනම් ඔබට බොහෝ විට භාවිතා කිරීමට සිදුවන බවත් එය හරයේ කොටසක් බවත් ඔබ දන්නේ නම්, නොවෝඩා උත්සාහ කරන්න.
නිකොලස් ජැෆෙල්

13

මගේ ලේසි ලැයිස්තුවේ දෙබල පරීක්ෂා කරන්න . මූලික වශයෙන්, මම ImageView හි ඇමතුම ප්‍රමාද කිරීමෙන් ලේසි ලැයිස්තුව වැඩි දියුණු කර ක්‍රම දෙකක් නිර්මාණය කරමි:

  1. ඔබට "රූපය පූරණය වේ ..." වැනි දෙයක් දැමීමට අවශ්‍ය වූ විට
  2. බාගත කළ රූපය පෙන්වීමට ඔබට අවශ්‍ය වූ විට.

මම ද ක්රියාත්මක කරමින් ImageLoader වැඩි දියුණු කටය මෙම වස්තුව දී.


12

ඔබට ෆේස්බුක් වැනි ෂිමර් පිරිසැලසුම ප්‍රදර්ශනය කිරීමට අවශ්‍ය නම් ඒ සඳහා නිල ෆේස්බුක් පුස්තකාලයක් ඇත. ෆේස්බුක් ෂිමර් ඇන්ඩ්‍රොයිඩ්

එය සෑම දෙයක්ම බලා ගනී, ඔබට අවශ්‍ය මෝස්තර කේතය කූඩු ආකාරයෙන් දිලිසෙන රාමුවකට දැමිය යුතුය. මෙන්න නියැදි කේතයක්.

<com.facebook.shimmer.ShimmerFrameLayout
     android:id=“@+id/shimmer_view_container”
     android:layout_width=“wrap_content”
     android:layout_height="wrap_content"
     shimmer:duration="1000">

 <here will be your content to display />

</com.facebook.shimmer.ShimmerFrameLayout>

මෙන්න ඒ සඳහා ජාවා කේතය.

ShimmerFrameLayout shimmerContainer = (ShimmerFrameLayout) findViewById(R.id.shimmer_view_container);
shimmerContainer.startShimmerAnimation();

ඔබගේ පරාමිති ගොනුවේ මෙම පරායත්තතාවය එක් කරන්න.

implementation 'com.facebook.shimmer:shimmer:0.1.0@aar'

මෙන්න එය පෙනෙන ආකාරය.දිලිසෙන ඇන්ඩ්‍රොයිඩ් තිර රුව


11

ඉහත සියළු කේත වලට ඔවුන්ගේම වටිනාකමක් ඇති නමුත් මගේ පෞද්ගලික අත්දැකීම් සමඟ පිකාසෝ සමඟ උත්සාහ කරන්න.

පිකාසෝ යනු මෙම අරමුණු සඳහා විශේෂයෙන් පුස්තකාලයකි, ඇත්ත වශයෙන්ම එය හැඹිලිය සහ අනෙකුත් සියලුම ජාල මෙහෙයුම් ස්වයංක්‍රීයව කළමනාකරණය කරනු ඇත. ඔබට ඔබේ ව්‍යාපෘතියේ පුස්තකාලය එක් කිරීමට සිදු වන අතර දුරස්ථ URL වෙතින් රූපය පූරණය කිරීම සඳහා තනි කේත පේළියක් ලියන්න.

කරුණාකර මෙතැනට පිවිසෙන්න: http://code.tutsplus.com/tutorials/android-sdk-working-with-picasso--cms-22149


9

ග්ලයිඩ පුස්තකාලය භාවිතා කරන්න. එය මා වෙනුවෙන් වැඩ කළ අතර ඔබේ කේතය සඳහාද එය ක්‍රියා කරනු ඇත. එය රූප දෙකටම මෙන්ම gif සඳහාද ක්‍රියා කරයි.

ImageView imageView = (ImageView) findViewById(R.id.test_image); 
    GlideDrawableImageViewTarget imagePreview = new GlideDrawableImageViewTarget(imageView);
    Glide
            .with(this)
            .load(url)
            .listener(new RequestListener<String, GlideDrawable>() {
                @Override
                public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {                       
                    return false;
                }

                @Override
                public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                    return false;
                }
            })
            .into(imagePreview);
}

7

ආකර්ශනීය ලෙස ක්‍රියා කරන වෙනත් ක්‍රමයක් මට නිර්දේශ කළ හැකිය: Android විමසුම.

ඔබ බාගත කල හැකිය භාජනයක් ගොනුව මෙහි

AQuery androidAQuery = new AQuery(this);

උදාහරණයක් ලෙස:

androidAQuery.id(YOUR IMAGEVIEW).image(YOUR IMAGE TO LOAD, true, true, getDeviceWidth(), ANY DEFAULT IMAGE YOU WANT TO SHOW);

එය ඉතා වේගවත් හා නිරවද්‍ය වන අතර මෙය භාවිතා කිරීමෙන් ඔබට පූරණය කිරීමේදී සජීවිකරණය, බිට්මැප් ලබා ගැනීම (අවශ්‍ය නම්) වැනි තවත් බොහෝ අංග සොයාගත හැකිය.


7

දෙන්න Aquery කියාපන්. පින්තූර අසමමුහුර්තව පැටවීම සහ හැඹිලි කිරීම සඳහා පුදුම සහගත සරල ක්‍රම එහි ඇත.



4
public class ImageDownloader {

Map<String, Bitmap> imageCache;

public ImageDownloader() {
    imageCache = new HashMap<String, Bitmap>();

}

// download function
public void download(String url, ImageView imageView) {
    if (cancelPotentialDownload(url, imageView)) {

        // Caching code right here
        String filename = String.valueOf(url.hashCode());
        File f = new File(getCacheDirectory(imageView.getContext()),
                filename);

        // Is the bitmap in our memory cache?
        Bitmap bitmap = null;

        bitmap = (Bitmap) imageCache.get(f.getPath());

        if (bitmap == null) {

            bitmap = BitmapFactory.decodeFile(f.getPath());

            if (bitmap != null) {
                imageCache.put(f.getPath(), bitmap);
            }

        }
        // No? download it
        if (bitmap == null) {
            try {
                BitmapDownloaderTask task = new BitmapDownloaderTask(
                        imageView);
                DownloadedDrawable downloadedDrawable = new DownloadedDrawable(
                        task);
                imageView.setImageDrawable(downloadedDrawable);
                task.execute(url);
            } catch (Exception e) {
                Log.e("Error==>", e.toString());
            }

        } else {
            // Yes? set the image
            imageView.setImageBitmap(bitmap);
        }
    }
}

// cancel a download (internal only)
private static boolean cancelPotentialDownload(String url,
        ImageView imageView) {
    BitmapDownloaderTask bitmapDownloaderTask = getBitmapDownloaderTask(imageView);

    if (bitmapDownloaderTask != null) {
        String bitmapUrl = bitmapDownloaderTask.url;
        if ((bitmapUrl == null) || (!bitmapUrl.equals(url))) {
            bitmapDownloaderTask.cancel(true);
        } else {
            // The same URL is already being downloaded.
            return false;
        }
    }
    return true;
}

// gets an existing download if one exists for the imageview
private static BitmapDownloaderTask getBitmapDownloaderTask(
        ImageView imageView) {
    if (imageView != null) {
        Drawable drawable = imageView.getDrawable();
        if (drawable instanceof DownloadedDrawable) {
            DownloadedDrawable downloadedDrawable = (DownloadedDrawable) drawable;
            return downloadedDrawable.getBitmapDownloaderTask();
        }
    }
    return null;
}

// our caching functions
// Find the dir to save cached images
private static File getCacheDirectory(Context context) {
    String sdState = android.os.Environment.getExternalStorageState();
    File cacheDir;

    if (sdState.equals(android.os.Environment.MEDIA_MOUNTED)) {
        File sdDir = android.os.Environment.getExternalStorageDirectory();

        // TODO : Change your diretcory here
        cacheDir = new File(sdDir, "data/ToDo/images");
    } else
        cacheDir = context.getCacheDir();

    if (!cacheDir.exists())
        cacheDir.mkdirs();
    return cacheDir;
}

private void writeFile(Bitmap bmp, File f) {
    FileOutputStream out = null;

    try {
        out = new FileOutputStream(f);
        bmp.compress(Bitmap.CompressFormat.PNG, 80, out);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (out != null)
                out.close();
        } catch (Exception ex) {
        }
    }
}

// download asynctask
public class BitmapDownloaderTask extends AsyncTask<String, Void, Bitmap> {
    private String url;
    private final WeakReference<ImageView> imageViewReference;

    public BitmapDownloaderTask(ImageView imageView) {
        imageViewReference = new WeakReference<ImageView>(imageView);
    }

    @Override
    // Actual download method, run in the task thread
    protected Bitmap doInBackground(String... params) {
        // params comes from the execute() call: params[0] is the url.
        url = (String) params[0];
        return downloadBitmap(params[0]);
    }

    @Override
    // Once the image is downloaded, associates it to the imageView
    protected void onPostExecute(Bitmap bitmap) {
        if (isCancelled()) {
            bitmap = null;
        }

        if (imageViewReference != null) {
            ImageView imageView = imageViewReference.get();
            BitmapDownloaderTask bitmapDownloaderTask = getBitmapDownloaderTask(imageView);
            // Change bitmap only if this process is still associated with
            // it
            if (this == bitmapDownloaderTask) {
                imageView.setImageBitmap(bitmap);

                // cache the image

                String filename = String.valueOf(url.hashCode());
                File f = new File(
                        getCacheDirectory(imageView.getContext()), filename);

                imageCache.put(f.getPath(), bitmap);

                writeFile(bitmap, f);
            }
        }
    }

}

static class DownloadedDrawable extends ColorDrawable {
    private final WeakReference<BitmapDownloaderTask> bitmapDownloaderTaskReference;

    public DownloadedDrawable(BitmapDownloaderTask bitmapDownloaderTask) {
        super(Color.WHITE);
        bitmapDownloaderTaskReference = new WeakReference<BitmapDownloaderTask>(
                bitmapDownloaderTask);
    }

    public BitmapDownloaderTask getBitmapDownloaderTask() {
        return bitmapDownloaderTaskReference.get();
    }
}

// the actual download code
static Bitmap downloadBitmap(String url) {
    HttpParams params = new BasicHttpParams();
    params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION,
            HttpVersion.HTTP_1_1);
    HttpClient client = new DefaultHttpClient(params);
    final HttpGet getRequest = new HttpGet(url);

    try {
        HttpResponse response = client.execute(getRequest);
        final int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode != HttpStatus.SC_OK) {
            Log.w("ImageDownloader", "Error " + statusCode
                    + " while retrieving bitmap from " + url);
            return null;
        }

        final HttpEntity entity = response.getEntity();
        if (entity != null) {
            InputStream inputStream = null;
            try {
                inputStream = entity.getContent();
                final Bitmap bitmap = BitmapFactory
                        .decodeStream(inputStream);
                return bitmap;
            } finally {
                if (inputStream != null) {
                    inputStream.close();
                }
                entity.consumeContent();
            }
        }
    } catch (Exception e) {
        // Could provide a more explicit error message for IOException or
        // IllegalStateException
        getRequest.abort();
        Log.w("ImageDownloader", "Error while retrieving bitmap from "
                + url + e.toString());
    } finally {
        if (client != null) {
            // client.close();
        }
    }
    return null;
 }
}

4

මට මෙම ගැටළුව ඇති අතර lruCache ක්‍රියාත්මක කළේය. ඔබට API 12 සහ ඊට ඉහළින් අවශ්‍ය යැයි මම විශ්වාස කරමි, නැතහොත් අනුකූලතා v4 පුස්තකාලය භාවිතා කරන්න. lurCache වේගයෙන් මතකය, නමුත් එය ද ඔබට ... ඔබ diskcache භාවිතා කල හැකි බව ගැන කණගාටු වෙනවා එසේ නම් ඒ සියල්ල විස්තර කරනවා, අයවැය ඇත ගබඩා ඔබ්බවා .

මම දැන් ඕනෑම තැනක සිට කැඳවන සිංගල්ටන් එකක් වන මගේ ක්‍රියාත්මක කිරීම ලබා දෙන්නෙමි:

//Where the first is a string and the other is a imageview to load.

DownloadImageTask.getInstance().loadBitmap(avatarURL, iv_avatar);

වෙබ් රූපය ලබා ගැනීමේදී ඇඩැප්ටරයක getView හි හැඹිලිය සඳහා සුදුසුම කේතය මෙන්න:

public class DownloadImageTask {

    private LruCache<String, Bitmap> mMemoryCache;

    /* Create a singleton class to call this from multiple classes */

    private static DownloadImageTask instance = null;

    public static DownloadImageTask getInstance() {
        if (instance == null) {
            instance = new DownloadImageTask();
        }
        return instance;
    }

    //Lock the constructor from public instances
    private DownloadImageTask() {

        // Get max available VM memory, exceeding this amount will throw an
        // OutOfMemory exception. Stored in kilobytes as LruCache takes an
        // int in its constructor.
        final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

        // Use 1/8th of the available memory for this memory cache.
        final int cacheSize = maxMemory / 8;

        mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
            @Override
            protected int sizeOf(String key, Bitmap bitmap) {
                // The cache size will be measured in kilobytes rather than
                // number of items.
                return bitmap.getByteCount() / 1024;
            }
        };
    }

    public void loadBitmap(String avatarURL, ImageView imageView) {
        final String imageKey = String.valueOf(avatarURL);

        final Bitmap bitmap = getBitmapFromMemCache(imageKey);
        if (bitmap != null) {
            imageView.setImageBitmap(bitmap);
        } else {
            imageView.setImageResource(R.drawable.ic_launcher);

            new DownloadImageTaskViaWeb(imageView).execute(avatarURL);
        }
    }

    private void addBitmapToMemoryCache(String key, Bitmap bitmap) {
        if (getBitmapFromMemCache(key) == null) {
            mMemoryCache.put(key, bitmap);
        }
    }

    private Bitmap getBitmapFromMemCache(String key) {
        return mMemoryCache.get(key);
    }

    /* A background process that opens a http stream and decodes a web image. */

    class DownloadImageTaskViaWeb extends AsyncTask<String, Void, Bitmap> {
        ImageView bmImage;

        public DownloadImageTaskViaWeb(ImageView bmImage) {
            this.bmImage = bmImage;
        }

        protected Bitmap doInBackground(String... urls) {

            String urldisplay = urls[0];
            Bitmap mIcon = null;
            try {
                InputStream in = new java.net.URL(urldisplay).openStream();
                mIcon = BitmapFactory.decodeStream(in);

            } 
            catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }

            addBitmapToMemoryCache(String.valueOf(urldisplay), mIcon);

            return mIcon;
        }

        /* After decoding we update the view on the main UI. */
        protected void onPostExecute(Bitmap result) {
            bmImage.setImageBitmap(result);
        }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.