Opis problemu: Tworzę przewijaną listę artykułów z miniaturami zapełnionymi przez moją bazę danych SQLite. Ogólnie rzecz biorąc, "działa" z wyjątkiem powolnego działania:Obrazy nie są buforowane lokalnie (przy użyciu programu Universal Image Loader) - czas ładowania wolnego obrazu
Obrazy ładują się bardzo powoli ... Pomyślałem, że użycie "Universal Image Loader" spowoduje zapisanie obrazów na urządzeniu i sprawi, że będą one wyglądać tak, jakby przewijały widok, już je obejrzałeś (lub przynajmniej blisko). Ale - gdy przeciągasz w górę/w dół, żadne z obrazów nie są dostępne, a następnie 3-5 sekund później, obrazy zaczynają pojawiać się (tak, jakby ponownie je pobierać)
Zmieniam widoczność miniatury pudła w locie, ale działa to bezbłędnie - nie wydają się zmieniać - po prostu przewijają się do widoku lub nie, nie migają ani nic. (ale obrazy nie pojawiają się przez kolejne kilka sekund).
Testowałem przez usunięcie mojego skryptu php po przewijaniu dookoła ... kiedy przewijam z powrotem do miejsca poprzedniego, obrazy nie pojawiają się - co powoduje, że zakładam, że ładuje się z mojego skryptu PHP KAŻDY czas.
Ale według the docs: "UsingFreqLimitedMemoryCache (najrzadziej używane bitmapy zostanie usunięta gdy zostanie przekroczony limit wielkości cache) - używana domyślnie"
szczegóły:
w moim ArticleEntryAdapter.js
mam :
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
// We need to get the best view (re-used if possible) and then
// retrieve its corresponding ViewHolder, which optimizes lookup efficiency
final View view = getWorkingView(convertView);
final ViewHolder viewHolder = getViewHolder(view);
final Article article = getItem(position);
// Set the title
viewHolder.titleView.setText(article.title);
//Set the subtitle (subhead) or description
if(article.subtitle != null)
{
viewHolder.subTitleView.setText(article.subtitle);
}
else if(article.description != null)
{
viewHolder.subTitleView.setText(article.description);
}
ImageLoader imageLoader = ImageLoader.getInstance();
imageLoader.displayImage("", viewHolder.thumbView); //clears previous one
if(article.filepath != null && article.filepath.length() != 0) {
imageLoader.displayImage(
"http://img.sltdb.com/processes/resize.php?image=" + article.filepath + "&size=100&quality=70",
viewHolder.thumbView
);
viewHolder.thumbView.setVisibility(View.VISIBLE);
} else {
viewHolder.thumbView.setVisibility(View.GONE);
}
return view;
}
Jeśli chodzi o niepoprawne obrazy - nie jest często, ale czasami przewijając, zobaczę 2 tego samego obrazu, a kiedy patrzę na artykuły, nie są one wcale powiązane (tj. nie ma szansy na to, że faktycznie mają ten sam obraz). Więc - odwracam się od niego iz powrotem, i nie jest już niepoprawnym obrazem.
UWAGA: Jestem nowy w Javie/Androidzie - prawdopodobnie już to zauważyłeś.
więcej kodu na komentarz-request:
private View getWorkingView(final View convertView) {
// The workingView is basically just the convertView re-used if possible
// or inflated new if not possible
View workingView = null;
if(null == convertView) {
final Context context = getContext();
final LayoutInflater inflater = (LayoutInflater)context.getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
workingView = inflater.inflate(articleItemLayoutResource, null);
} else {
workingView = convertView;
}
return workingView;
}
UPDATE: Mój plik manifestu zawiera:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Ale folder cache znalazłem jest całkowicie pusta:
mnt
-sdcard
-Android
-data
-com.mysite.news
-cache
-uil-images
co jest 'getWorkingView (convertView);'? –
@Sherif elKhatib - dodano – Dave