- Siêu lớp và danh mục iOS/Objective-C
- object-c - -1001 lỗi khi NSURLSession vượt qua httpproxy và /etc/hosts
- java - Nhận địa chỉ url bằng lớp mạng
- ios - Âm thanh không phát trong thông báo đẩy
Tôi có bộ điều hợp ListView tùy chỉnh triển khai lớp ImageThreadLoader. Thật không may, lớp này không bật tùy chọn bộ đệm - tải xuống hình ảnh từ web và lưu chúng dưới dạng bộ đệm.
Sau đó tôi tìm thấy cái này Danh sách lười biếnghoặc đâyRất hữu ích, nó hoạt động giống hệt như lớp ImageThreadLoader của tôi, nhưng nó có thể lưu hình ảnh làm bộ đệm. Vì vậy, tôi muốn triển khai lớp ImageLoader của nó vào bộ điều hợp ListView tùy chỉnh hiện tại của mình.
Thật không may, cấu trúc mã của tôi hoàn toàn khác với cấu trúc của Lazylist, gây ra một số xung đột trong nỗ lực của tôi. Ví dụ: LazyList sử dụng một chuỗi các chuỗi làm URL hình ảnh, mặt khác, tôi sử dụng JSON làm nguồn của URL hình ảnh.
Đó là lý do tại sao tôi cần trợ giúp ở đây để điều chỉnh bộ điều hợp ListView của mình cho phù hợp với lớp ImageLoader này.
Mã này như sau:
Lớp ImageLoader mà tôi muốn triển khai trong bộ điều hợp ListView tùy chỉnh của mình:
lớp công khai ImageLoader {
// cách triển khai bộ đệm trong bộ nhớ đơn giản nhất. Điều này nên được thay thế bằng một cái gì đó như SoftReference hoặc BitmapOptions.inPurgeable(kể từ 1.6)
HashMap riêng tư cache=new HashMap();
Tệp riêng cacheDir;
Trình tải hình ảnh công khai(Ngữ cảnh){
// Đặt mức độ ưu tiên thấp của nền. Bằng cách này, nó sẽ không ảnh hưởng đến hiệu suất giao diện người dùng.
photoLoaderThread.setPriority(Thread.NORM_PRIORITY-1);
//Tìm thư mục lưu ảnh đã lưu vào bộ nhớ cache
if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
cacheDir=Tệp mới(android.os.Environment.getExternalStorageDirectory(),"Android/data/LazyList");
khác
cacheDir=context.getCacheDir();
if(!cacheDir.exists())
cacheDir.mkdirs();
}
int cuối cùng stub_id=R.drawable.stub;
public void DisplayImage(Chuỗi url, Hoạt động hoạt động, Chế độ xem hình ảnh trong ImageView)
{
if(cache.containsKey(url))
imageView.setImageBitmap(cache.get(url));
khác
{
queuePhoto(url, hoạt động, imageView);
imageView.setImageResource(stub_id);
}
}
riêng tư void queuePhoto(Chuỗi url, Hoạt động hoạt động, ImageView imageView)
{
// ImageView này có thể đã được sử dụng cho các hình ảnh khác trước đây nên có thể có một số tác vụ cũ trong hàng đợi nên chúng ta cần loại bỏ chúng.
photosQueue.Clean(imageView);
PhotoToLoad p=PhotoToLoad mới(url, imageView);
được đồng bộ hóa(photosQueue.photosToLoad){
photosQueue.photosToLoad.push(p);
photosQueue.photosToLoad.notifyAll();
}
//bắt đầu chủ đề nếu nó chưa bắt đầu
if(photoLoaderThread.getState()==Thread.State.NEW)
photoLoaderThread.start();
}
Bitmap riêng tư getBitmap(Chuỗi url)
{
// Tôi xác định hình ảnh bằng mã băm. Không phải là giải pháp hoàn hảo, tốt cho bản demo.
Tên tệp chuỗi=String.valueOf(url.hashCode());
Tệp f=Tệp mới (cacheDir, tên tệp);
// từ bộ đệm SD
Bitmap b = giải mãFile(f);
if(b!=null)
return b;
// từ web
thử {
Bitmap bitmap=null;
InputStream là=URL mới(url).openStream();
OutputStream os = new FileOutputStream(f);
Utils.CopyStream(is, os);
os.close();
bitmap = giải mãFile(f);
trả về bitmap;
} bắt (Ngoại lệ cũ){
ex.printStackTrace();
return null;
}
}
// giải mã hình ảnh và chia tỷ lệ để giảm mức tiêu thụ bộ nhớ
Giải mã bitmap riêng tưFile(File f){
thử {
// giải mã kích thước ảnh
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(FileInputStream(f),null,o);
//Tìm giá trị đúng của thang đo. Nó phải là lũy thừa của 2.
int cuối cùng REQUIRED_SIZE=70;
int width_tmp=o.outWidth, Height_tmp=o.outHeight;
tỷ lệ int=1;
trong khi(đúng){
if(width_tmp/2 <>
phá vỡ;
width_tmp/=2;
chiều cao_tmp/=2;
tỷ lệ*=2;
}
// giải mã bằng inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize=tỷ lệ;
trả về BitmapFactory.decodeStream(FileInputStream(f), null, o2);
} bắt (FileNotFoundException e) {}
return null;
}
//Nhiệm vụ cho hàng đợi
lớp riêng PhotoToLoad
{
url chuỗi công khai;
Chế độ xem hình ảnh công khai Chế độ xem hình ảnh;
công khai PhotoToLoad(Chuỗi u, ImageView i){
url=u;
imageView=i;
}
}
PhotosQueue photosQueue=New PhotosQueue();
public void stopThread()
{
photoLoaderThread.interrupt();
}
//lưu trữ danh sách ảnh cần tải xuống
lớpẢnhHàng đợi
{
ngăn xếp riêng tư photosToLoad=ngăn xếp mới();
// xóa tất cả các phiên bản của ImageView này
public void Clean(hình ảnh ImageView)
{
for(int j=0 ;j<>
if(photosToLoad.get(j).imageView==hình ảnh)
photosToLoad.remove(j);
khác
++j;
}
}
}
lớp PhotosLoader mở rộng Chủ đề {
công khai void run() {
thử {
trong khi (đúng)
{
//luồng đợi cho đến khi có bất kỳ hình ảnh nào được tải trong hàng đợi
if(photosQueue.photosToLoad.size()==0)
được đồng bộ hóa(photosQueue.photosToLoad){
photosQueue.photosToLoad.wait();
}
if(photosQueue.photosToLoad.size()!=0)
{
PhotoToLoad photoToLoad;
được đồng bộ hóa(photosQueue.photosToLoad){
photoToLoad=photosQueue.photosToLoad.pop();
}
Bitmap bmp=getBitmap(photoToLoad.url);
cache.put(photoToLoad.url, bmp);
Thẻ đối tượng=photoToLoad.imageView.getTag();
if(tag!=null && ((String)tag).equals(photoToLoad.url)){
BitmapDisplayer bd=bitmapDisplayer mới (bmp, photoToLoad.imageView);
Hoạt động a=(Hoạt động)photoToLoad.imageView.getContext();
a.runOnUiThread(bd);
}
}
if(Thread.interrupted())
phá vỡ;
}
} bắt (InterruptedException e) {
//cho phép thread thoát
}
}
}
PhotosLoader photoLoaderThread=New PhotosLoader();
// Được sử dụng để hiển thị bitmap trong luồng UI
lớp BitmapDisplayer triển khai Runnable
{
Bản đồ bitmap;
ImageView imageView;
public BitmapDisplayer(Bitmap b, ImageView i){bitmap=b;imageView=i;}
public void run()
{
if(bitmap!=null)
imageView.setImageBitmap(bitmap);
khác
imageView.setImageResource(stub_id);
}
}
khoảng trống công khai ClearCache() {
//xóa bộ nhớ đệm
cache.clear();
// xóa bộ nhớ đệm SD
Tệp[] files=cacheDir.listFiles();
for(Tệp f:tệp)
f.delete();
}
}
Bộ điều hợp ListView tùy chỉnh từ dự án LazyList:
lớp công khai LazyAdapter mở rộng BaseAdapter {
hoạt động hoạt động cá nhân;
dữ liệu Chuỗi [] riêng tư;
tĩnh riêng LayoutInflater inflater=null;
Trình tải hình ảnh công khai Trình tải hình ảnh;
public LazyAdapter(Hoạt động a, String[] d) {
hoạt động = a;
dữ liệu=d;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageLoader=ImageLoader mới(activity.getApplicationContext());
}
công khai int getCount() {
trả về dữ liệu.length;
}
Đối tượng công khai getItem(int location) {
trở lại vị trí;
}
công khai getItemId (vị trí int) {
trở lại vị trí;
}
lớp tĩnh công khai ViewHolder{
văn bản TextView công khai;
hình ảnh ImageView công khai;
}
Chế độ xem công khai getView(int location, View ConvertView, ViewGroup parent) {
Xem vi=convertView;
Người giữ ViewHolder;
if(convertView==null){
vi = inflater.inflate(R.layout.item, null);
chủ sở hữu=ViewHolder mới();
Holder.text=(TextView)vi.findViewById(R.id.text);;
Holder.image=(ImageView)vi.findViewById(R.id.image);
vi.setTag(người giữ);
}
khác
Holder=(ViewHolder)vi.getTag();
Holder.text.setText("item "+position);
Holder.image.setTag(data[position]);
imageLoader.DisplayImage(dữ liệu[vị trí], hoạt động, chủ.image);
return vi;
}
}
Đây là bộ điều hợp ListView tùy chỉnh của tôi:Lớp ProjectAdapter
lớp công khai ProjectAdapter mở rộng ArrayAdapter {
tài nguyên int;
Phản hồi chuỗi;
Bối cảnh bối cảnh;
Chuỗi tĩnh cuối cùng riêng tư TAG = "MediaItemAdapter";
riêng tư ImageThreadLoader imageLoader = new ImageThreadLoader();
//Khởi tạo bộ chuyển đổi
public ProjectAdapter(Ngữ cảnh, tài nguyên int, Danh sách mục) {
super(bối cảnh, tài nguyên, vật phẩm);
this.resource=resource;
}
@Ghi đè
Chế độ xem công khai getView(int location, View ConvertView, ViewGroup parent)
{
Tiêu đề văn bản TextView;
hình ảnh ImageView cuối cùng;
Dự án pro = getItem(position);
Dự án LinearLayoutView;
// Tăng cường tầm nhìn
if(convertView==null)
{
projectView = new LinearLayout(getContext());
Trình tăng chuỗi = Context.LAYOUT_INFLATER_SERVICE;
LayoutInflater vi;
vi = (LayoutInflater)getContext().getSystemService(inflater);
vi.inflate(resource, projectView, true);
}
khác
{
projectView = (LinearLayout) ConvertView;
}
thử {
textTitle = (TextView)projectView.findViewById(R.id.txt_title);
hình ảnh = (ImageView)projectView.findViewById(R.id.image);
} bắt(ClassCastException e) {
Log.e(TAG, "Bố cục của bạn phải cung cấp hình ảnh và chế độ xem văn bản cùng với biểu tượng và văn bản của ID.", e);
throw e;
}
Bitmap cachedImage = null;
thử {
cachedImage = imageLoader.loadImage(pro.smallImageUrl, new ImageLoadedListener() {
public void imageLoaded(Bitmap imageBitmap) {
image.setImageBitmap(imageBitmap);
thông báoDataSetChanged();
});
} bắt (MalformedURLException e) {
Log.e(TAG, "URL hình ảnh từ xa xấu: " + pro.smallImageUrl, e);
}
textTitle.setText(pro.project_title);
if( cachedImage != null ) {
image.setImageBitmap(cachedImage);
}
trả về projectView;
}
}
Cảm ơn bạn rất nhiều!!
biên tập
gia hạn:Danh sách dự ánHoạt động
lớp công khai ProjectList mở rộng Hoạt động {
/** Được gọi khi hoạt động được tạo lần đầu tiên */
//ListView sẽ giữ các tham chiếu các mục của chúng ta trở lại main.xml
ListView lstTest;
// Bộ điều hợp mảng sẽ giữ ArrayList của chúng ta và hiển thị các mục trên ListView
ProjectAdapter arrayAdapter;
Hộp thoại ProgressDialog;
// Danh sách sẽ lưu trữ các mục của chúng tôi và cho phép chúng tôi sửa đổi bộ điều hợp mảng đó
ArrayList prjcts=null;
@Ghi đè
khoảng trống công khai onCreate(Gói đã lưuInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.projects_list);
//Khởi tạo ListView
lstTest= (ListView)findViewById(R.id.lstText);
// Khởi tạo ArrayList của chúng tôi
prjcts = new ArrayList();
//Khởi tạo bộ điều hợp mảng của chúng tôi, lưu ý cách nó tham chiếu bố cục listitems.xml
arrayAdapter = new ProjectAdapter(ProjectsList.this, R.layout.listitems,prjcts,ProjectsList.this);
// Đặt bộ chuyển đổi ở trên làm bộ chuyển đổi được lựa chọn cho danh sách của chúng tôi
lstTest.setAdapter(arrayAdapter);
nếu (isOnline())
{
// Khởi tạo Lớp dịch vụ web bằng URL của dịch vụ web mà bạn không phải vượt qua
//WebService webService = WebService mới("http://notalentrocks.com/myplaceapp/projects.json");
Dịch vụ web WebService = Dịch vụ web mới ("http://liebenwald.spendino.net/admanager/dev/android/projects.json");
// Truyền tham số nếu cần, nếu không thì truyền tham số giả như sau
Map params = new HashMap();
params.put("var", "");
// Nhận phản hồi JSON từ máy chủ, "" là nơi tên phương thức thường xuất hiện nếu cần ví dụ
// webService.webGet("getMoreAllerts", params);
Phản hồi chuỗi = webService.webGet("", params);
thử
{
hộp thoại = ProgressDialog.show(ProjectsList.this, "", "Đang tìm nạp dự án...", true);
hộp thoại.setCancelable(true);
hộp thoại.setCanceledOnTouchOutside(true);
hộp thoại.setOnCancelListener(OnCancelListener mới() {
public void onCancel(hộp thoại DialogInterface) {
}
});
// Phân tích phản hồi vào đối tượng của chúng tôi
Nhập CollectionType = new TypeToken<>>(){}.getType();
//JSON mong đợi một danh sách nên không thể sử dụng ArrayList của chúng tôi từ đầu
List lst= new Gson().fromJson(response, CollectionType);
// Bây giờ chúng ta đã có danh sách đó, hãy thêm nó vào ArrayList để chứa các mục của chúng ta.
for(Dự án l : lst)
{
prjcts.add(l);
ConstantData.projectsList.add(l);
}
//Vì chúng ta đã sửa đổi arrayList nên bây giờ chúng ta cần thông báo cho adapter rằng
// dữ liệu của nó đã thay đổi để cập nhật giao diện người dùng
arrayAdapter.notifyDataSetChanged();
hộp thoại.dismiss();
}
bắt (Ngoại lệ e)
{
Log.d("Lỗi: ", e.getMessage());
}
}
lstTest.setOnItemClickListener(OnItemClickListener mới() {
public void onItemClick(AdapterView> parent, View view, int location, long id) {
Chăm sóc ý định = Ý định mới(ProjectsList.this, ProjectDetail.class);
care.putExtra("spendino.de.ProjectDetail.position",position);
startActivity(care);
}
});
}
boolean được bảo vệ isOnline() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnected()) {
trả về đúng sự thật;
} khác {
Hộp thông báo AlertDialog.Builder = new AlertDialog.Builder(this);
Alertbox.setTitle("spendino Helfomat");
notificationbox.setMessage ("Vui lòng kiểm tra kết nối internet của bạn");
Alertbox.setPositiveButton("OK", DialogInterface mới.OnClickListener() {
public void onClick(hộp thoại DialogInterface, int id) {
//Main.this.finish();
}
});
hộp cảnh báo.show();
trả về sai;
}
}
}
đã cập nhậtĐây là stacktrace của tôi:
05-12 11:36:52.670: LỖI/AndroidRuntime(299): Nguyên nhân: java.lang.NullPointerException
12-05 11:36:52.670: LỖI/AndroidRuntime(299): tại android.content.ContextWrapper.getCacheDir(ContextWrapper.java:183)
05-12 11:38:29.386: LỖI/AndroidRuntime(324): tại chi tiêu.de.ImageLoader.(ImageLoader.java:41)
05-12 11:36:52.670: LỖI/AndroidRuntime(299): tại chi tiêu.de.Main.(Main.java:56)
Trình tải hình ảnh 41 là:cacheDir=context.getCacheDir();
Chính 56 là:riêng tư ImageLoaderCache imageLoader = new ImageLoaderCache(Main.this);
chính.java
Lớp công khai Main mở rộng Hoạt động { /** Được gọi khi Hoạt động được tạo lần đầu tiên. */
ArrayList prjcts=null;
Chuỗi tĩnh cuối cùng riêng tư TAG = "MediaItemAdapter";
Trình tải hình ảnh Trình tải hình ảnh;
hoạt động hoạt động cá nhân;
Hình ảnhXem hình ảnh1;
ImageView image2;
ImageView image3;
@Ghi đè
khoảng trống công khai onCreate(Gói đã lưuInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
nếu (isOnline())
{
prjcts = new ArrayList();
Dịch vụ web WebService = Dịch vụ web mới ("http://liebenwald.spendino.net/admanager/dev/android/projects.json");
Map params = new HashMap();
params.put("var", "");
Phản hồi chuỗi = webService.webGet("", params);
imageLoader = ImageLoader mới(Main.this);
thử
{
Nhập CollectionType = new TypeToken<>>(){}.getType();
List lst= new Gson().fromJson(response, CollectionType);
for(Dự án l : lst)
{
prjcts.add(l);
ConstantData.projectsList.add(l);
}
}
bắt (Ngoại lệ e)
{
Log.d("Lỗi: ", e.getMessage());
}
thử {
image1 = (ImageView)findViewById(R.id.top1);
image2 = (ImageView)findViewById(R.id.top2);
image3 = (ImageView)findViewById(R.id.top3);
} bắt(ClassCastException e) {
Log.e(TAG, "Bố cục của bạn phải cung cấp hình ảnh và chế độ xem văn bản cùng với biểu tượng và văn bản của ID.", e);
throw e;
}
// ngẫu nhiên hóa chỉ mục của hình ảnh
int max = prjcts.size();
Danh sách chỉ số = new ArrayList(max);
for(int c = 1; c < max; ++c)
{
chỉ số.add (c);
}
Random r = new Random();
int ArrayIndex = r.nextInt(indices.size());
int RandomIndex1 =index.get(arrIndex);
chỉ số.remove(arrIndex);
int ArrayIndex2 = r.nextInt(indices.size());
int RandomIndex2 = chỉ số.get(arrIndex2);
chỉ số.remove(arrIndex2);
int ArrayIndex3 = r.nextInt(indices.size());
int RandomIndex3 =index.get(arrIndex3);
chỉ số.remove(arrIndex3);
imageLazy(image1, prjcts.get(randomIndex1));
imageLazy(image2, prjcts.get(randomIndex2));
imageLazy(image3, prjcts.get(randomIndex3));
image1.setOnClickListener(RandomClickListener mới(randomIndex1));
image2.setOnClickListener(RandomClickListener mới(randomIndex2));
image3.setOnClickListener(RandomClickListener mới(randomIndex3));
}
dự án Nút cuối cùng = (Nút) findViewById(R.id.btn_projectslist);
Thông tin nút cuối cùng = (Nút) findViewById(R.id.btn_infos);
Liên hệ nút cuối cùng = (Nút) findViewById(R.id.btn_contact);
project.setOnClickListener(project_listener);
infos.setOnClickListener(infos_listener);
contact.setOnClickListener(contact_listener);
}
/*
* isOnline - Kiểm tra xem có NetworkConnection không
* @return boolean
*/
boolean được bảo vệ isOnline() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnected()) {
trả về đúng sự thật;
} khác {
Hộp thông báo AlertDialog.Builder = new AlertDialog.Builder(this);
Alertbox.setTitle("spendino Helfomat");
Alertbox.setMessage ("Bitte überprüfen Sie Ihre Internetverbindung");
Alertbox.setPositiveButton("OK", DialogInterface mới.OnClickListener() {
public void onClick(hộp thoại DialogInterface, int id) {
Main.this.finish();
}
});
hộp cảnh báo.show();
trả về sai;
}
}
lớp tĩnh công khai ViewHolder{
hình ảnh ImageView công khai;
}
public void imageLazy(hình ảnh ImageView cuối cùng, Project pro)
{
imageLoadery.displayImage(pro.smallImageUrl, hoạt động, hình ảnh);
}
public void setImage(Bitmap cachedImage, hình ảnh ImageView cuối cùng, Project pro)
{
thử {
cachedImage = imageLoader.loadImage(pro.smallImageUrl, ImageLoadedListener mới()
{
hình ảnh trống công khai đã được tải(Hình ảnh bitmapBitmap)
{
image.setImageBitmap(imageBitmap);
}
});
} bắt (MalformedURLException e) {
Log.e(TAG, "URL hình ảnh từ xa xấu: " + pro.smallImageUrl, e);
}
if( cachedImage != null ) {
image.setImageBitmap(cachedImage);
}
}
lớp công khai RandomClickListener triển khai View.OnClickListener
{
int cuối cùng riêng tư RandomIndex;
Public RandomClickListener(int RandomIndex cuối cùng)
{
this.randomIndex = RandomIndex;
}
@Ghi đè
khoảng trống công khai trênClick(Xem v)
{
Ý định hàng đầu = Ý định mới (Main.this, ProjectDetail.class);
top.putExtra("spendino.de.ProjectDetail.position", RandomIndex);
startActivity(trên cùng);
}
}
Dấu vết ngăn xếp:
12-05 13:48:12.606: LỖI/AndroidRuntime(433): tại chi tiêuino.de.ImageLoaderCache$PhotosLoader.run(ImageLoaderCache.java:244)
câu trả lời hay nhất
Có vẻ như bạn không sử dụng bất kỳ ngăn chứa Chế độ xem nào trong bộ điều hợp
Tôi đã thực hiện thay đổi đối với lớp học của bạn. Hy vọng nó hiệu quả với bạn mà không gặp bất kỳ khó khăn nào
ImageThreadLoader 类
nhập java.io.File;
nhập java.io.FileInputStream;
nhập java.io.FileNotFoundException;
nhập java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
nhập java.net.URL;
nhập java.util.HashMap;
nhập java.util.Stack;
import android.app.Activity;
nhập android.content.Context;
nhập android.graphics.Bitmap;
nhập android.graphics.BitmapFactory;
nhập android.widget.ImageView;
lớp công khai ImageThreadLoader {
// cách triển khai bộ đệm trong bộ nhớ đơn giản nhất. Điều này nên được thay thế bằng một cái gì đó như SoftReference hoặc BitmapOptions.inPurgeable(kể từ 1.6)
/** Bộ đệm */
HashMap riêng tư cache=new HashMap();
/** Thư mục bộ đệm */
Tệp riêng cacheDir;
/**
* Khởi tạo trình tải hình ảnh mới.
*
* @param bối cảnh bối cảnh
*/
public ImageThreadLoader(Ngữ cảnh bối cảnh){
// Đặt mức độ ưu tiên thấp của nền. Bằng cách này, nó sẽ không ảnh hưởng đến hiệu suất giao diện người dùng.
photoLoaderThread.setPriority(Thread.NORM_PRIORITY-1);
//Tìm thư mục lưu ảnh đã lưu vào bộ nhớ cache
if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
cacheDir=Tệp mới(android.os.Environment.getExternalStorageDirectory(),"cache_dir_img");
khác
cacheDir=context.getCacheDir();
if(!cacheDir.exists())
cacheDir.mkdirs();
}
// Cái này được sử dụng cho sơ khai khi người dùng không thể nhìn thấy hình ảnh thực tế..
// hình ảnh này sẽ được nhìn thấy
int stub_id cuối cùng =R.drawable.sample_image;
/**
* Hiển thị hình ảnh.
*
* @param url url
* @param hoạt động hoạt động
* @param imageXem chế độ xem hình ảnh
*/
public void displayImage(Chuỗi url, Hoạt động hoạt động, Chế độ xem hình ảnh ImageView)
{
if(cache.containsKey(url))
imageView.setImageBitmap(cache.get(url));
khác
{
queuePhoto(url, hoạt động, imageView);
imageView.setImageResource(stub_id);
}
}
/**
* Ảnh xếp hàng.
*
* @param url url
* @param hoạt động hoạt động
* @param imageXem chế độ xem hình ảnh
*/
riêng tư void queuePhoto(Chuỗi url, Hoạt động hoạt động, ImageView imageView)
{
// ImageView này có thể đã được sử dụng cho các hình ảnh khác trước đây nên có thể có một số tác vụ cũ trong hàng đợi nên chúng ta cần loại bỏ chúng.
photosQueue.Clean(imageView);
PhotoToLoad p=PhotoToLoad mới(url, imageView);
được đồng bộ hóa(photosQueue.photosToLoad){
photosQueue.photosToLoad.push(p);
photosQueue.photosToLoad.notifyAll();
}
//bắt đầu chủ đề nếu nó chưa bắt đầu
if(photoLoaderThread.getState()==Thread.State.NEW)
photoLoaderThread.start();
}
/**
* Lấy bitmap.
*
* @param url url
* @return bitmap
*/
Bitmap riêng tư getBitmap(Chuỗi url)
{
// Tôi xác định hình ảnh bằng mã băm. Không phải là giải pháp hoàn hảo, tốt cho bản demo.
Tên tệp chuỗi=String.valueOf(url.hashCode());
Tệp f=Tệp mới (cacheDir, tên tệp);
// từ bộ đệm SD
Bitmap b = giải mãFile(f);
if(b!=null)
return b;
// từ web
thử {
Bitmap bitmap=null;
InputStream là=URL mới(url).openStream();
OutputStream os = new FileOutputStream(f);
copyStream(is,os);
os.close();
bitmap = giải mãFile(f);
trả về bitmap;
} bắt (Ngoại lệ cũ){
ex.printStackTrace();
return null;
}
}
// giải mã hình ảnh và chia tỷ lệ để giảm mức tiêu thụ bộ nhớ
/**
* Giải mã tập tin.
*
* @param f the f
* @return bitmap
*/
Giải mã bitmap riêng tưFile(File f){
thử {
// giải mã kích thước ảnh
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(FileInputStream(f),null,o);
//Tìm giá trị đúng của thang đo. Nó phải là lũy thừa của 2.
int cuối cùng REQUIRED_SIZE=70;
int width_tmp=o.outWidth, Height_tmp=o.outHeight;
tỷ lệ int=1;
trong khi(đúng){
if(width_tmp/2 <>
phá vỡ;
width_tmp/=2;
chiều cao_tmp/=2;
tỷ lệ++;
}
// giải mã bằng inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize=tỷ lệ;
trả về BitmapFactory.decodeStream(FileInputStream(f), null, o2);
} bắt (FileNotFoundException e) {}
return null;
}
//Nhiệm vụ cho hàng đợi
/**
* Lớp PhotoToLoad.
*/
lớp riêng PhotoToLoad
{
/** Địa chỉ */
url chuỗi công khai;
/** Chế độ xem hình ảnh */
Chế độ xem hình ảnh công khai Chế độ xem hình ảnh;
/**
* Tạo một bức ảnh mới để tải.
*
* @param bạn là bạn
* @param tôi là tôi
*/
công khai PhotoToLoad(Chuỗi u, ImageView i){
url=u;
imageView=i;
}
}
/** Hàng đợi ảnh */
PhotosQueue photosQueue=New PhotosQueue();
/**
* Dừng chủ đề.
*/
public void stopThread()
{
photoLoaderThread.interrupt();
}
//lưu trữ danh sách ảnh cần tải xuống
/**
* Hàng đợi ảnh lớp.
*/
lớpẢnhHàng đợi
{
/** Những bức ảnh cần tải */
ngăn xếp riêng tư photosToLoad=ngăn xếp mới();
// xóa tất cả các phiên bản của ImageView này
/**
*Lau dọn.
*
* @param hình ảnh hình ảnh
*/
public void Clean(hình ảnh ImageView)
{
for(int j=0 ;j<>
if(photosToLoad.get(j).imageView==hình ảnh)
photosToLoad.remove(j);
khác
++j;
}
}
}
/**
* Trình tải ảnh lớp.
*/
lớp PhotosLoader mở rộng Chủ đề {
/* (không phải Javadoc)
* @xem java.lang.Thread#run()
*/
công khai void run() {
thử {
trong khi (đúng)
{
//luồng đợi cho đến khi có bất kỳ hình ảnh nào được tải trong hàng đợi
if(photosQueue.photosToLoad.size()==0)
được đồng bộ hóa(photosQueue.photosToLoad){
photosQueue.photosToLoad.wait();
}
if(photosQueue.photosToLoad.size()!=0)
{
PhotoToLoad photoToLoad;
được đồng bộ hóa(photosQueue.photosToLoad){
photoToLoad=photosQueue.photosToLoad.pop();
}
Bitmap bmp=getBitmap(photoToLoad.url);
cache.put(photoToLoad.url, bmp);
if(((String)photoToLoad.imageView.getTag()).equals(photoToLoad.url)){
BitmapDisplayer bd=bitmapDisplayer mới (bmp, photoToLoad.imageView);
Hoạt động a=(Hoạt động)photoToLoad.imageView.getContext();
a.runOnUiThread(bd);
}
}
if(Thread.interrupted())
phá vỡ;
}
} bắt (InterruptedException e) {
//cho phép thread thoát
}
}
}
/** Chuỗi tải ảnh */
PhotosLoader photoLoaderThread=New PhotosLoader();
// Được sử dụng để hiển thị bitmap trong luồng UI
/**
* Lớp BitmapDisplayer.
*/
lớp BitmapDisplayer triển khai Runnable
{
/** Bản đồ bit */
Bản đồ bitmap;
/** Chế độ xem hình ảnh */
ImageView imageView;
/**
* Khởi tạo một trình hiển thị bitmap mới.
*
* @param b the b
* @param tôi là tôi
*/
public BitmapDisplayer(Bitmap b, ImageView i){bitmap=b;imageView=i;}
/* (không phải Javadoc)
* @xem java.lang.Runnable#run()
*/
public void run()
{
if(bitmap!=null)
imageView.setImageBitmap(bitmap);
khác
imageView.setImageResource(stub_id);
}
}
/**
* Xóa bộ nhớ đệm.
*/
khoảng trống công khai ClearCache() {
//xóa bộ nhớ đệm
cache.clear();
// xóa bộ nhớ đệm SD
Tệp[] files=cacheDir.listFiles();
for(Tệp f:tệp)
f.delete();
}
public static void copyStream(InputStream is, OutputStream os) {
int cuối cùng buffer_size=1024;
thử
{
byte[] byte=byte mới[buffer_size];
vì(;;)
{
int count=is.read(byte, 0, buffer_size);
nếu(đếm==-1)
phá vỡ;
os.write(byte, 0, số đếm);
}
}
bắt(Ngoại lệ cũ){}
}
}
bây giờ của bạnDự ánAdapter类
nhập java.util.List;
import android.app.Activity;
nhập android.content.Context;
nhập android.view.LayoutInflater;
nhập android.view.View;
nhập android.view.ViewGroup;
nhập android.widget.ArrayAdapter;
nhập android.widget.ImageView;
nhập android.widget.TextView;
lớp công khai ProjectAdapter mở rộng ArrayAdapter {
tài nguyên int;
Phản hồi chuỗi;
Bối cảnh bối cảnh;
Danh sách các mục ;
ImageThreadLoader riêng tư imageLoader;
LayoutInflater mInflater;
Hoạt động hoạt động;
//Khởi tạo bộ chuyển đổi
public ProjectAdapter(Ngữ cảnh, tài nguyên int, các mục Danh sách,
Hoạt động hoạt động) {
super(bối cảnh, tài nguyên, vật phẩm);
this.resource = tài nguyên;
imageLoader = new ImageThreadLoader(context);
this.items = vật phẩm;
bối cảnh mInflater = (LayoutInflater)
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.activity = hoạt động;
}
@Ghi đè
Chế độ xem công khai getView(int location, View ConvertView, ViewGroup parent) {
Người giữ ViewHolder = null;
// Tăng cường tầm nhìn
if (convertView == null) {
ConvertView = mInflater.inflate(resource, null);
chủ = ViewHolder mới();
Holder.image = (ImageView) ConvertView.findViewById(R.id.image);
Holder.textTitle = (TextView) ConvertView
.findViewById(R.id.txt_title);
ConvertView.setTag(holder);
} khác {
chủ sở hữu = (ViewHolder) ConvertView.getTag();
}
Dự án dự án = items.get(position);
Holder.textTitle.setText(project.project_title);
Chuỗi imageurl = project.smallImageUrl;
Holder.image.setTag(imageurl);
imageLoader.displayImage(imageurl,hoạt động,holder.image);
trả về ConvertView;
}
lớp tĩnh ViewHolder {
Tiêu đề văn bản TextView;
Hình ảnh Xem hình ảnh;
}
Cuối cùng, khi bạn lấy được dữ liệu mạng trong ListView
Sử dụng điều này khi thiết lập bộ chuyển đổi trong
your_listview.setAdapter(your_ProjectAdapter_instance );
your_ProjectAdapter_instance .notifyDataSetChanged();
Về Android: Để giúp sử dụng lớp ImageLoader (LazyList) nhằm điều chỉnh bộ điều hợp ListView, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/5867894/
Tôi có 3 AutoCompleteTextView và tôi muốn đăng ký 2 bộ điều hợp String[] trên chúng. Hiện tại, tôi đang làm điều này: atw_from.setAdapter(new ArrayAdapt
Tôi cần triển khai RecyclerView để hiển thị truy vấn của mình tới Parse, vì vậy tôi đã thực hiện việc này: Phân trang lớp riêng tư mở rộng RecyclerView.OnScro
Tôi mới làm quen với BizTalk và hiện tại tôi chỉ đang khám phá các tính năng của nó cũng như tìm hiểu cách các phần khác nhau (kiến trúc, điều phối, cổng, v.v.) hoạt động cùng nhau. Tôi có câu hỏi về bộ điều hợp của nó: Các bộ điều hợp khác nhau đã được cài đặt sẵn và sẵn sàng đặt cấu hình với cài đặt BizTalk Server chưa, hoặc
Tôi đang gặp sự cố khi kiểm tra bộ điều hợp MQSC trong BizTalk để giao tiếp với hàng đợi trên máy chủ Z/OS. Kịch bản thử nghiệm: Khi gửi tin nhắn qua Biztalk, tôi (buộc) dừng và khởi động kênh máy chủ để mô phỏng IPL của máy chủ.
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
Tôi muốn sử dụng thiết bị âm thanh của mình để ghi tín hiệu âm thanh trên iPhone từ cáp âm thanh 3,5mm thông thường (ví dụ: một chiếc iPhone khác làm nguồn âm thanh). Vì iPhone có giắc cắm tai nghe 4 cổng nên không thể cắm trực tiếp được. Tôi đã thử nhiều loại khác nhau
[Xem cập nhật bên dưới] Tôi gặp khó khăn khi xác định lược đồ. Đồng nghiệp của tôi cho biết đây là mẫu bộ chuyển đổi. Tôi không biết. Chúng tôi gặp khó khăn chủ yếu vì chúng tôi muốn đặt tên chính xác cho các thành phần của mình. Câu hỏi: Đây có phải là chế độ bộ chuyển đổi không? Nếu không thì nó là gì? Nếu là việc khác thì là thực hiện ý tưởng
Tôi hơi không quen với cách hoạt động của Java KeyAdapter và tôi nhận được kết quả không mong muốn khi sử dụng KeyAdapter bằng mã sau. Sự cố này xảy ra khi một phím được nhấn trong khi một phím khác đã được nhấn, bất kể isKeyPressed()
Tôi muốn biết cách tạo nhiều bảng trong MySQL bằng Node.js thông qua bộ điều hợp ORM. Tôi đã tạo một bảng thông qua mô hình, tức là "us.js" module.exports = { Identity: 'us'
Tôi có một máy khách JavaFx. Tôi đang sử dụng một Bean làm mô hình có một trường ObservableSet. Tôi muốn hiển thị dữ liệu này thành ListView nhưng tôi không thể thay đổi loại trường của mình thành Observa
Tôi đang cố triển khai xác thực dựa trên biểu mẫu trong ứng dụng iOS gốc nhưng tôi cần đăng nhập mà không nhận được thử thách, tôi muốn mở biểu mẫu và đăng nhập. Tôi đã triển khai Chall có chứa hàm isCustomResponse
Tôi đang cố gắng triển khai bộ chuyển đổi vòng lặp ngược cho các lớp iterator và const_iterator của mình nhưng tôi gặp một số sự cố. Nếu có ai có thể hướng dẫn tôi giải quyết vấn đề này thì điều đó sẽ được đánh giá rất cao! Ý tưởng là tôi có thể thực hiện việc này từ rbegin() và ren của mình!
Cách được khuyến nghị để tạo bất kỳ số lượng đối tượng bộ điều hợp kênh gửi đến nào bằng cách sử dụng spring-integration-sftp là gì? Ứng dụng của tôi cần giám sát nhiều thư mục từ xa (1 đến n), những thư mục này không được biết cho đến khi chạy. Câu trả lời hay nhất hiện nay
Tôi đang cố gắng tạo một bộ chuyển đổi cho khung riêng của chúng tôi. Khung của chúng tôi sử dụng cơ chế xác nhận riêng nên tôi cần viết một bộ chuyển đổi. Lớp bộ điều hợp rất đơn giản và trông như thế này: public class AllureReportListener {
Có cách nào để triển khai bộ chuyển đổi Worklight bằng dòng lệnh thay vì sử dụng bảng điều khiển Worklight không? (Vì máy chủ Worklight của tôi được cài đặt trên WAS nên lệnh wsadmin hoặc tương tự...
Tôi muốn xây dựng bộ điều hợp log4j (mạng) tùy chỉnh của riêng mình để giải quyết vấn đề mà tôi đã đăng ở đây. Tôi đã xem tài liệu về log4j nhưng không thể biết các nhà phát triển thảo luận về cách thực hiện việc này ở đâu. Ai đó có thể chỉ cho tôi cách chính xác
Tôi đang sử dụng bộ điều hợp kênh điều khiển thông báo để nhận thông báo xml dưới dạng chuỗi từ hàng đợi JMS weblogic và sau đó chuyển thông báo này đến kênh tích hợp mùa xuân để lưu trữ vào cơ sở dữ liệu, chuyển đổi sang xml khác,
Có cách nào để triển khai bộ chuyển đổi Worklight bằng dòng lệnh thay vì sử dụng bảng điều khiển Worklight không? (Vì máy chủ Worklight của tôi được cài đặt trên WAS nên lệnh wsadmin hoặc tương tự...
Tôi đang cố gắng tạo một ứng dụng trò chuyện cho Android nên tôi đang sử dụng RecyclerView. Tôi gặp sự cố với bộ điều hợp và phản hồi JSON tôi nhận được từ phòng trò chuyện của mình xuất hiện trống. Có điều gì tôi đang thiếu trong mã của mình không? Đây là lớp bộ chuyển đổi của tôi
Nếu đây là một bản sao, tôi xin lỗi trước. Tôi mới bắt đầu phát triển Android và đang cố gắng tìm giải pháp nhưng không thể tìm được giải pháp hiệu quả. Tôi đang tạo một ứng dụng việc cần làm và gặp phải lỗi này trong bộ điều hợp của mình. java.lang.NullP
Tôi là một lập trình viên xuất sắc, rất giỏi!