2013-12-18 6 views
0

리소스에서 이미지를 검색하고 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은 비어 있습니다. 제대로 작동하는 스레드를 제거하면 비어 있습니다.

+0

데이터를 가져온 후에 UI 스레드가 GridView를 업데이트하도록 알려면 Handler를 만들어야합니다. Android는 'AsyncTask'를 제공합니다. http://developer.android.com/reference/android/os/AsyncTask.html – 323go

+0

ArrayList를 AsyncTask에 전달하려면 어떻게해야합니까? –

+0

@ChristianGiupponi 여전히 도움이 필요한 경우 AsyncTask의 간단한 예제를 만들었습니다. – JJ86

답변

0

run 메소드의 리턴 유형이 void이므로 스레드 인스턴스는 값을 리턴 할 수 없습니다. 할 수있는 일은 delegate 패턴 (Android의 리스너)을 구현하거나 Callable 인터페이스와 Executors으로 전환하는 것입니다. 반환 유형 인 을 기다리는 것이 일 수 있음을 유의하십시오. 당신이 만약 뭔가 :

의사 코드 UIThread :

variable = threadInstance.getResult(); 

는 비동기 호출을 한, 323go에 의해 지적

0

동기, 당신은 사용할 수 있습니다 AsyncTask를 (더 나은 IMHO). 이 같은 내부 클래스를 만듭니다

private class MyAsyncTask extends AsyncTask<ArrayList<String>, Integer, Long> { 
    ... 
} 

정수 (방금 대신 무효 넣어, 하나 필요하지 않은 경우) 진행 대화 상자를 업데이트하는 데 사용됩니다; 길게는 DoInBackground 메소드의 결과입니다. 이처럼 AsyncTask를을 시작 :

new MyAsyncTask().execute(passing); 

지금 난 당신이 목표로하고 있습니다 모르겠어요,하지만 당신은 323go 또는 this tutorial 제안 링크를 따라하는 경우, 당신은 당신의 코드를 향상시킬 수 있습니다. 당신이 내부 변수를 만들 필요가 물론

new MyAsyncTask(passing).execute(); 

당신의 AsyncTask를 클래스 :

편집 323go 코멘트를 한 후

, AsyncTask를 생성자에서 객체의 당신의 ArrayList를 전달하는 것이 좋습니다

... 
private ArrayList<Object> myArrayList; 

private MyAsyncTask(ArrayList<Object> anArrayList) { 
    myArrayList = anArrayList; 
} 
... 
+1

'ArrayList'를 서브 클래 싱 된 생성자에 전달하고'doInBackground()'가 새로운'ArrayList'를 리턴하도록하는 것이 좋을 것이다. onPostExecute()에 할당된다. 이것은'doInBackground()'가 다른 위협에서 실행되기 때문에 병행 성 문제를 피합니다. – 323go

+0

@ 323go 실제로, 당신 말이 맞아요! 고맙습니다 ;-) . – JJ86