리소스에서 이미지를 검색하고 GridView
에 표시하는 기능이 있습니다. Everithing 잘 작동하지만 인해 성능 문제에 그래서 나는 새로운 ProgressDialog
앱이 작동하는지 사용자가 알 수 있도록 만들 런타임 엄지 손가락에 만들 싶습니다안드로이드 - 스레드의 반환 값
import java.util.ArrayList;
import android.app.Fragment;
import android.app.ProgressDialog;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.InflateException;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import com.italiandevteam.chuck.adapter.GridViewAdapter;
import com.italiandevteam.chuck.model.ImageItem;
public class GalleriaPersonaggio extends Fragment{
Integer personaggio = null;
private ProgressDialog progressDialog;
TypedArray imgs = null;
final ArrayList imageItems = new ArrayList();
public GalleriaPersonaggio(int personaggio){
this.personaggio = personaggio;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
int id = getIdPersonaggio();
View rootView = null;
try {
rootView = inflater.inflate(R.layout.gallery_grid, container, false);
}
catch (InflateException e) {
}
final GridView gridView = (GridView) rootView.findViewById(R.id.gridView);
GridViewAdapter customGridAdapter = new GridViewAdapter(getActivity(), R.layout.gallery_row, getData(personaggio));
gridView.setAdapter(customGridAdapter);
gridView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
// HashMap<String, Object> hm = gridView.getAdapter().getPosition(position);
//
// String imgPath = (String) hm.get("flag"); //get downloaded image path
// Intent i = new Intent(getActivity(), MostraImmagine.class); //start new Intent to another Activity.
// i.putExtra("ClickedImagePath", imgPath); //put image link in intent.
// startActivity(i);
}
});
return rootView;
}
public int getIdPersonaggio(){
return this.personaggio;
}
private ArrayList getData(int personaggio) {
// retrieve String drawable array
switch(personaggio)
{
case 1:{
imgs = getResources().obtainTypedArray(R.array.chuck_ids);
break;
}
case 2:{
imgs = getResources().obtainTypedArray(R.array.sarah_ids);
break;
}
default:{
imgs = getResources().obtainTypedArray(R.array.chuck_ids);
}
}
final ProgressDialog ringProgressDialog = ProgressDialog.show(getActivity(), "Please wait ...", "Loading Images ...", true);
ringProgressDialog.setCancelable(true);
new Thread(new Runnable() {
@Override
public void run() {
try {
int THUMBNAIL_HEIGHT = 100;
int THUMBNAIL_WIGHT = 100;
for (int i = 0; i < imgs.length(); i++)
{
Bitmap bitmap = BitmapFactory.decodeResource(getActivity().getResources(), imgs.getResourceId(i, -1));
bitmap = Bitmap.createScaledBitmap(bitmap, THUMBNAIL_HEIGHT, THUMBNAIL_WIGHT, false);
// ByteArrayOutputStream baos = new ByteArrayOutputStream();
// bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
// byte[] imageData = baos.toByteArray();
// InputStream is = new ByteArrayInputStream(imageData);
// Bitmap b = BitmapFactory.decodeStream(is);
imageItems.add(new ImageItem(bitmap, "Image#" + i));
}
} catch (Exception e) {
}
ringProgressDialog.dismiss();
}
}).start();
return imageItems;
}
}
문제는이다 그 말에 코드가 아무 것도 반환하지 않으면 GridView
은 비어 있습니다. 제대로 작동하는 스레드를 제거하면 비어 있습니다.
데이터를 가져온 후에 UI 스레드가 GridView를 업데이트하도록 알려면 Handler를 만들어야합니다. Android는 'AsyncTask'를 제공합니다. http://developer.android.com/reference/android/os/AsyncTask.html – 323go
ArrayList를 AsyncTask에 전달하려면 어떻게해야합니까? –
@ChristianGiupponi 여전히 도움이 필요한 경우 AsyncTask의 간단한 예제를 만들었습니다. – JJ86