将图像从asynctask获取到自定义Gridview适配器

时间:2014-08-29 13:31:59

标签: android asynchronous android-asynctask adapter

我正在制作一个图库应用程序,当我在Getview类的Getview中执行我的asynctask时,只有Asynctask的onPreExecution部分执行而其他部分没有。

所以,我看到的是一个进度条但是没有下载后的图像...在我的活动上只是一个进度条继续滚动

这是我的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类......它就是

  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);

        }
    });

有谁能告诉我怎么办?

1 个答案:

答案 0 :(得分:2)

您不应该在AsyncTask中运行getView()。由于它是异步的,getView()不会等待它返回。它将返回空白ImageView

您应该在设置适配器之前运行任务并首先获取所有图像。

您还可以使用像Picaso这样的图像加载库。您也可以在Google上找到其他库,以及如何使用它们。你不应该使用StrictMode

在运行getView()

之前获取图片

onCreate()中运行任务。然后,只需在Adapter的任务中设置onPostExecute()

Related explanation