1

I am using asynctask to download images and then once it has finished downloading, it should load the images into my horizontal gallery. is it possible?

for now i have tried but it keeps crashing:

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

new downloadFile().execute();
gallery = (Gallery) findViewById(R.id.examplegallery);
gallery.setAdapter(new AddImgAdp(this));

    gallery.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView parent, View v, int position, long id) {
            // Displaying the position when the gallery item in clicked
            Toast.makeText(MainActivity.this, "Position=" + position, Toast.LENGTH_SHORT).show();
    }
    });

}

/**
     * Background Async Task to Load all product by making HTTP Request
     * */
    class downloadFile extends AsyncTask<String, String, String> {

        /**
         * getting all magazines from url
         * */
        protected String doInBackground(String... args) {
            URL myFileUrl = null;

        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        // getting JSON string from URL
        JSONObject json = jParser.makeHttpRequest(url_login, "GET", params);

        // Check your log cat for JSON reponse
        Log.d("All Products: ", json.toString());

        try {
            // Checking for SUCCESS TAG
            int success = json.getInt(TAG_SUCCESS);

            if (success == 1) {
                // products found
                // Getting Array of Products
                mag = json.getJSONArray(TAG_MAGAZINE);

                for (int i = 0; i < mag.length(); i++) {
                    JSONObject c = mag.getJSONObject(i);

                    // Storing each json item in variable
                    String magLink = c.getString(TAG_MAGAZINE_URL);
                    String magThumb = c.getString(TAG_MAGAZINE_THUMBNAIL);
                    //String magazineIssue = c.getString(TAG_MAGAZINE_ISSUE);

                    urlList.add(magLink);
                    //urlList.add(magazineIssue);
                    thumbnailList.add(magThumb);

                    System.out.println(thumbnailList);
                }                   
            } 
            else {

            }
        } catch (JSONException e) {
            e.printStackTrace();
        }


        for (int i = 0; i < thumbnailList.size(); i ++)
        {
        thumbnail = thumbnailList.get(i).toString();
        Log.d("thumbnail", thumbnail);
        number = i;
            try {
                myFileUrl = new URL(thumbnail);    // RETRIEVE IMAGE URL
                }
             catch (MalformedURLException e) {
                e.printStackTrace();
            }
            try {
                HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
                conn.setDoInput(true);
                conn.connect();
                InputStream in = conn.getInputStream();
                Log.i("im connected", "Download");
                bmImg = BitmapFactory.decodeStream(in);

                File filename;
                try {
                     // GET EXTERNAL STORAGE, SAVE FILE THERE
                    File storagePath = new File(Environment.getExternalStorageDirectory(),"Covers");
                    storagePath.mkdirs();

                    filename = new File(storagePath + "/photo"+number+".jpg");
                    FileOutputStream out = new FileOutputStream(filename);
                    bmImg.compress(Bitmap.CompressFormat.JPEG, 90, out);

                    out.flush();
                    out.close();
                    MediaStore.Images.Media.insertImage(getContentResolver(),filename.getAbsolutePath(), filename.getName(),
                            filename.getName());          



                 // displayImage();
                } catch (Exception e) {
                    e.printStackTrace();
                }   



            } catch (IOException e) {
                e.printStackTrace();
            }   

        }

            return null;
        }

        /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute() {    

        runOnUiThread(new Runnable() {
            public void run() {

              ArrayList<String>  mStringList= new ArrayList<String>();
              File strPath = new File(Environment.getExternalStorageDirectory() + "/Covers");
              int lists = strPath.listFiles().length; 
              Log.d("number of items in array ",String.valueOf(lists));

              File yourDir = new File(strPath, "");
              for (File f : yourDir.listFiles()) {
                  if (f.isFile())
                  {
                      String name = f.getName();
                      String v = strPath + "/" + name;
                      mStringList.add(v);
                  }
              }

              mImageIds = new String[mStringList.size()];
              mImageIds = mStringList.toArray(mImageIds);

              for(int a = 0; a < mImageIds.length ; a++){
                  Log.d("string is",(mImageIds[a]));
              }


            }



        });
    }
    }   

    public class AddImgAdp extends BaseAdapter {
        int GalItemBg;
        private Context cont;

        public AddImgAdp(Context c) {
            cont = c;
            TypedArray typArray = obtainStyledAttributes(R.styleable.GalleryTheme);
            GalItemBg = typArray.getResourceId(R.styleable.GalleryTheme_android_galleryItemBackground, 0);
            typArray.recycle();
            }
        public int getCount() {
            return mImageIds.length;
        }

        public Object getItem(int position) {
        return position;
        }

        public long getItemId(int position) {
        return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imgView = new ImageView((Context) cont);

        imgView.setImageDrawable(Drawable.createFromPath(mImageIds[position]));

        // Fixing width & height for image to display
        imgView.setLayoutParams(new Gallery.LayoutParams(80, 70));
        imgView.setScaleType(ImageView.ScaleType.FIT_XY);
        imgView.setBackgroundResource(GalItemBg);

        return imgView;
        }
        }

}

this is my logcat output:

12-28 12:08:10.510: E/AndroidRuntime(5567): FATAL EXCEPTION: main
12-28 12:08:10.510: E/AndroidRuntime(5567): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.horizontalviewing/com.example.horizontalviewing.MainActivity}: java.lang.NullPointerException
12-28 12:08:10.510: E/AndroidRuntime(5567):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1978)
12-28 12:08:10.510: E/AndroidRuntime(5567):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2003)
12-28 12:08:10.510: E/AndroidRuntime(5567):     at android.app.ActivityThread.access$600(ActivityThread.java:123)
12-28 12:08:10.510: E/AndroidRuntime(5567):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1169)
12-28 12:08:10.510: E/AndroidRuntime(5567):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-28 12:08:10.510: E/AndroidRuntime(5567):     at android.os.Looper.loop(Looper.java:137)
12-28 12:08:10.510: E/AndroidRuntime(5567):     at android.app.ActivityThread.main(ActivityThread.java:4446)
12-28 12:08:10.510: E/AndroidRuntime(5567):     at java.lang.reflect.Method.invokeNative(Native Method)
12-28 12:08:10.510: E/AndroidRuntime(5567):     at java.lang.reflect.Method.invoke(Method.java:511)
12-28 12:08:10.510: E/AndroidRuntime(5567):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-28 12:08:10.510: E/AndroidRuntime(5567):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-28 12:08:10.510: E/AndroidRuntime(5567):     at dalvik.system.NativeStart.main(Native Method)
12-28 12:08:10.510: E/AndroidRuntime(5567): Caused by: java.lang.NullPointerException
12-28 12:08:10.510: E/AndroidRuntime(5567):     at com.example.horizontalviewing.MainActivity$AddImgAdp.getCount(MainActivity.java:247)
12-28 12:08:10.510: E/AndroidRuntime(5567):     at android.widget.AbsSpinner.setAdapter(AbsSpinner.java:113)
12-28 12:08:10.510: E/AndroidRuntime(5567):     at com.example.horizontalviewing.MainActivity.onCreate(MainActivity.java:69)
12-28 12:08:10.510: E/AndroidRuntime(5567):     at android.app.Activity.performCreate(Activity.java:4465)
12-28 12:08:10.510: E/AndroidRuntime(5567):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
12-28 12:08:10.510: E/AndroidRuntime(5567):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1942)
12-28 12:08:10.510: E/AndroidRuntime(5567):     ... 11 more
user1234555
  • 209
  • 3
  • 14
  • Just move `gallery.setAdapter(new AddImgAdp(this));` line inside `onPostExecute()` after adding elements in `mimageids`. and no need to use `runOnUiThread` in `onPostExecute()` because it's possible we can access / update Ui from `onPostExecute()` method of AsyncTask – ρяσѕρєя K Dec 28 '12 at 04:56
  • I tried but it says "The constructor MainActivity.AddImgAdp(MainActivity.downloadFile) is undefined." – user1234555 Dec 28 '12 at 05:01
  • yes it's saying right use `gallery.setAdapter(new AddImgAdp(MainActivity.this));` instead of `gallery.setAdapter(new AddImgAdp(this));` – ρяσѕρєя K Dec 28 '12 at 05:03
  • I have tried gallery.setAdapter(new AddImgAdp(MainActivity.this)); and the application doesnt crash now but it shows a blank page and no error message – user1234555 Dec 28 '12 at 06:09
  • means you have done just check your getView method in Adapter .see [this](http://android-er.blogspot.in/2010/06/using-convertview-in-getview-to-make.html) tutorial and change your adapter getView method – ρяσѕρєя K Dec 28 '12 at 06:15
  • can you tell me what went wrong with my getView method? I've been looking at it but i don't know what is wrong – user1234555 Dec 28 '12 at 08:02

2 Answers2

1

You have a null pointer exception in the getCount method because you initialize the adapter before the post execute initializes, either move your adapter creation into the postexecute code or initialize the array mImageIds first.

0

The error is telling you mimageids has not been initialized when getCount() runs. The problem is that mImageIds is not a variable of the adapter. An adapter should be self contained. You should create add/remove image methods on your adapter so you can add them as they are downloaded from the server. Or something like that.

dmon
  • 30,048
  • 8
  • 87
  • 96