2014-08-29 44 views
0

我正在製作一個圖庫應用程序,當我在Adapter類的Getview中執行我的asynctask時,只有onynctask的preExecution部分獲取執行,而其他人不執行。從asynctask獲取圖像到自定義Gridview適配器

所以,我看到的是一個進度條,但不下載後的圖像...我只是活動的進度條不斷滾動

這裏是我的Getview方法的代碼

enter public View getView(int position, View convertview, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    img=new ImageView(mContext); 
    new DownloadImage().execute(); 
    return img; 

} 

這是我Asynctaskclass

private class DownloadImage extends AsyncTask<String, Void, Bitmap>{ 
    @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 

      mProgressDialog = new ProgressDialog(mContext); 
      // Set progressdialog title 
      mProgressDialog.setTitle("Download Image"); 
      // Set progressdialog message 
      mProgressDialog.setMessage("Loading..."); 
      mProgressDialog.setIndeterminate(false); 
      // Show progressdialog 
      mProgressDialog.show(); 
     } 
@Override 
protected Bitmap doInBackground(String... URL) { 
    // TODO Auto-generated method stub 
    String imageURL = URL[0]; 
     Bitmap bitmap = null; 
     try { 
      // Download Image from URL 
      InputStream input = new java.net.URL(imageURL).openStream(); 
      // Decode Bitmap 
      bitmap = BitmapFactory.decodeStream(input); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return bitmap; 

} 

@Override 
protected void onPostExecute(Bitmap result) { 

    // Set the bitmap into ImageView 

    img.setImageBitmap(result); 
    // Close progressdialog 
    mProgressDialog.dismiss(); 
} 
}  

我想執行onPreExecution我GetView方法返回IMG變量,以我的MainActivity後,只需右鍵class..here是

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 

    setTitle("My Gallery"); 
    GridView g=(GridView)findViewById(R.id.gallery); 
    // Gallery g=(Gallery)findViewById(R.id.gallery); 
    // ImageAdapter width=new ImageAdapter(context); 


    g.setAdapter(new ImageAdapter(this)); 

    Resources r = getResources(); 
    float padding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 
      GRID_PADDING, r.getDisplayMetrics()); 





    g.setNumColumns(NUM_OF_COLUMN); 
    g.setColumnWidth(columnWidth); 
    g.setStretchMode(GridView.NO_STRETCH); 
    g.setPadding((int) padding, (int) padding, (int) padding, 
      (int) padding); 
    // g.setHorizontalSpacing((int) padding); 
    // g.setVerticalSpacing((int) padding); 
    g.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView parent, View v, int position, 
       long id) { 
      // TODO Auto-generated method stub 


      Intent i=new Intent(getApplicationContext(),ImageViewPager.class); 
     i.putExtra("id", position); 
     startActivity(i); 

     } 
    }); 

有人可以告訴我該怎麼做?

回答

2

您不應該在getView()中運行AsyncTask。由於它是異步的,getView()不會等待它返回。它將返回一個空白ImageView

您應該在設置適配器並首先獲取所有圖像之前運行該任務。

您還可以使用一些圖像加載庫,如Picaso。您可以Google和其他圖書館以及如何使用它們。而且你不應該使用StrictMode

要在運行getView()

onCreate()運行任務之前獲得的圖像。然後簡單地將您的Adapter設置爲您的任務的onPostExecute()

Related explanation

+0

所以你的意思是說,我應該在MainActivity並讓所有的影像,然後應該設置適配器後,執行的AsyncTask? – 2014-08-29 14:32:32

+0

是的。根據您的圖片的數量/大小,您可能需要考慮我提到的圖書館。但是,是的,你不想在'getView()' – codeMagic 2014-08-29 14:42:15

+0

謝謝@codeMagic。你可以參考我的任何示例代碼? – 2014-08-29 18:16:40

相關問題