使用单个AsyncTask上载所有列表项

时间:2015-03-25 03:58:28

标签: android android-asynctask

按钮点击将批量图像上传到服务器,但有一个问题,每当我点击上传全部按钮时,它就会开始上传所有列表项图像,但每次为每个列表行恢复新进度时。< / p>

就像我在列表中有500个列表项一样,所以它恢复了500个进度,而我只想使用单个进度。

这是我的代码,我正在使用:

public class MainActivity extends Activity {

    static ListView lstView;
    private Handler handler = new Handler();;
    static List<MyData> ImageList;
    String strPath;
    int position;
    File newFile;
    ViewHolder holder;
    View v;
    String fileName;
    ImageAdapter mAdapter;
    Button btnUploadAll;
    int i=0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        btnUploadAll = (Button) findViewById(R.id.btnUploadAll);

        btnUploadAll.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if(ImageList.size()!=0)
                {
                    new UploadFileAsync().execute(String.valueOf(i));   
                }       
            }
        });

        /*** Get Images from SDCard ***/
        ImageList = getSD();
        // ListView and imageAdapter
        lstView = (ListView) findViewById(R.id.listView);
        mAdapter = new ImageAdapter(this);
        lstView.setAdapter(mAdapter);

    }

    private List<MyData> getSD() {
        List<MyData> it = new ArrayList<MyData>();
        String root_sd = Environment.getExternalStorageDirectory().toString();
        File f = new File(root_sd + "/mydata");
        File[] files = f.listFiles();
        for (int i = 0; i < files.length; i++) {
            File file = files[i];
            Log.d("Count", file.getPath());
            MyData data = new MyData();
            data.setImages(file.getPath());
            data.setStatusEnable(true);
            it.add(data);
        }
        return it;
    }

    static class ViewHolder {
        public ViewHolder(View convertView) {
            // TODO Auto-generated constructor stub
        }

        TextView textName;
        ImageView thumbnail;
        TextView textStatus;
        Button btnUpload;

    }

    public class ImageAdapter extends BaseAdapter {
        public ImageAdapter(Context c) {

        }

        public int getCount() {
            // TODO Auto-generated method stub
            return ImageList.size();
        }

        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        public View getView(final int position, View convertView,
                ViewGroup parent) {
            // Avoid unneccessary calls to findViewById() on each row, which is
            // expensive!

            holder = null;

            if (convertView == null) {
                convertView = getLayoutInflater().inflate(
                        R.layout.adapter_main, null);
                holder = new ViewHolder(convertView);

                // Create a ViewHolder and store references to the children
                // views
                holder.textName = (TextView) convertView
                        .findViewById(R.id.textName);
                holder.thumbnail = (ImageView) convertView
                        .findViewById(R.id.thumbnail);
                holder.btnUpload = (Button) convertView
                        .findViewById(R.id.btnUpload);
                holder.textStatus = (TextView) convertView
                        .findViewById(R.id.textStatus);

                // The tag can be any Object, this just happens to be the
                // ViewHolder
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            holder.btnUpload.setEnabled(ImageList.get(position)
                    .isStatusEnable());
            holder.textStatus.setText(ImageList.get(position).getMessage());
            strPath = ImageList.get(position).getImages().toString();

            // Get File Name
            fileName = strPath.substring(strPath.lastIndexOf('/') + 1,
                    strPath.length());
            File file = new File(strPath);
            @SuppressWarnings("unused")
            long length = file.length();
            holder.textName.setText(fileName);

            final BitmapFactory.Options options = new BitmapFactory.Options();

            Bitmap bm = BitmapFactory.decodeFile(strPath, options);
            holder.thumbnail.setImageBitmap(bm);                       

            // btnUpload
            holder.btnUpload.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    // Upload
                    startUpload(position);
                }
            });

            return convertView;

        }
    }

    // Upload

    public void startUpload(final int position) {

        Runnable runnable = new Runnable() {

            public void run() {

                handler.post(new Runnable() {

                    public void run() {
                        v = lstView.getChildAt(position
                                - lstView.getFirstVisiblePosition());
                        holder = (ViewHolder) v.getTag();
                        synchronized (this) {
                            ImageList.get(position).setStatusEnable(false);
                            mAdapter.notifyDataSetChanged();
                        }

                        new UploadFileAsync().execute(String.valueOf(position));
                    }
                });
            }
        };
        new Thread(runnable).start();
    }

    // Async Upload
    public class UploadFileAsync extends AsyncTask<String, Void, Void> {

        private ProgressDialog pDialog;
        String resServer;

        protected void onPreExecute() {
            super.onPreExecute();

            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        @Override
        protected Void doInBackground(String... params) {
            position = Integer.parseInt(params[0]);
            int bytesRead, bytesAvailable, bufferSize;
            byte[] buffer;
            int maxBufferSize = 1 * 1024 * 1024;
            int resCode = 0;
            String resMessage = "";

            String lineEnd = "\r\n";
            String twoHyphens = "--";
            String boundary = "*****";

            // File Path
            String strSDPath = ImageList.get(position).getImages().toString();

            // Upload to PHP Script
            String strUrlServer = "http://10.0.2.2/uploadFile.php";

            try {
                /** Check file on SD Card ***/
                File file = new File(strSDPath);
                if (!file.exists()) {
                    resServer = "{\"StatusID\":\"0\",\"Message\":\"Please check path on SD Card\"}";
                    return null;
                }

                FileInputStream fileInputStream = new FileInputStream(new File(
                        strSDPath));

                URL url = new URL(strUrlServer);
                HttpURLConnection conn = (HttpURLConnection) url
                        .openConnection();
                conn.setDoInput(true);
                conn.setDoOutput(true);
                conn.setUseCaches(false);
                conn.setRequestMethod("POST");

                conn.setRequestProperty("Connection", "Keep-Alive");
                conn.setRequestProperty("Content-Type",
                        "multipart/form-data;boundary=" + boundary);

                DataOutputStream outputStream = new DataOutputStream(
                        conn.getOutputStream());
                outputStream.writeBytes(twoHyphens + boundary + lineEnd);
                outputStream
                        .writeBytes("Content-Disposition: form-data; name=\"filUpload\";filename=\""
                                + strSDPath + "\"" + lineEnd);
                outputStream.writeBytes(lineEnd);

                bytesAvailable = fileInputStream.available();
                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                buffer = new byte[bufferSize];

                // Read file
                bytesRead = fileInputStream.read(buffer, 0, bufferSize);

                while (bytesRead > 0) {
                    outputStream.write(buffer, 0, bufferSize);
                    bytesAvailable = fileInputStream.available();
                    bufferSize = Math.min(bytesAvailable, maxBufferSize);
                    bytesRead = fileInputStream.read(buffer, 0, bufferSize);
                }

                outputStream.writeBytes(lineEnd);
                outputStream.writeBytes(twoHyphens + boundary + twoHyphens
                        + lineEnd);

                // Response Code and Message
                resCode = conn.getResponseCode();
                if (resCode == HttpURLConnection.HTTP_OK) {
                    InputStream is = conn.getInputStream();
                    ByteArrayOutputStream bos = new ByteArrayOutputStream();

                    int read = 0;
                    while ((read = is.read()) != -1) {
                        bos.write(read);
                    }

                    byte[] result = bos.toByteArray();
                    bos.close();

                    resMessage = new String(result);

                }

                Log.d("resCode=", Integer.toString(resCode));
                Log.d("resMessage=", resMessage.toString());

                fileInputStream.close();
                outputStream.flush();
                outputStream.close();

                resServer = resMessage.toString();

            } catch (Exception ex) {
                ex.printStackTrace();
            }

            return null;
        }

        protected void onPostExecute(Void unused) {
            if(i<imageList.size()){
              i++;
              new UploadFileAsync().execute(String.valueOf(i));
            }
            statusWhenFinish(position, resServer);
         // dismiss the dialog once product deleted
            pDialog.dismiss();
        }

    }

    // When Upload Finish
    @SuppressWarnings("unused")
    protected void statusWhenFinish(int position, String resServer) {

        /*** Default Value ***/
        String strStatusID = "";
        String strError = "";

        try {

            JSONObject c = new JSONObject(resServer);
            strStatusID = c.getString("StatusID");
            strError = c.getString("Message");
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // // prepare Status
        if (strStatusID.equals("0")) {         
                    ImageList.get(position).setMessage("Failed");
                    ImageList.get(position).setStatusEnable(true);  
                    mAdapter.notifyDataSetChanged();

        } else if (strStatusID.equals("1")) {
                    ImageList.get(position).setMessage("Already Exists");
                    ImageList.get(position).setStatusEnable(false); 
                    mAdapter.notifyDataSetChanged();

        } else if(strStatusID.equals("2")) {
                    ImageList.get(position).setMessage("Uploaded");
                    ImageList.get(position).setStatusEnable(false); 
                    mAdapter.notifyDataSetChanged();
        } else {

        }       

    }

    /**
     * Introduce a class with below attributes to hold a state of each row in
     * single element
     * 
     */
    public class MyData {
        /* Image url or path of image in single row */
        private String images;

        /* anme of image in single row */
        private String name;

        /* status ID of image in single row */
        private String statusID;

        /* message of image in single row */
        private String message;

        private boolean statusEnable;

        public boolean isStatusEnable() {
            return statusEnable;
        }

        public void setStatusEnable(boolean statusEnable) {
            this.statusEnable = statusEnable;
        }

        // Generate getters and setter
        public String getImages() {
            return images;
        }

        public void setImages(String images) {
            this.images = images;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getStatusID() {
            return statusID;
        }

        public void setStatusID(String statusID) {
            this.statusID = statusID;
        }

        public String getMessage() {
            return message;
        }

        public void setMessage(String message) {
            this.message = message;
        }

      }

    }

4 个答案:

答案 0 :(得分:2)

再次抱歉,我现在忙于编辑你的整个代码,所以我会给你指示。 首先,将asynctask类中的private ProgressDialog pDialog;移动到全局变量,如:

String fileName;
ImageAdapter mAdapter;
Button btnUploadAll;
int i=0;
private ProgressDialog pDialog;

其次,将进度对话框的实例化对象移动到:

if(ImageList.size()!=0)
{
  pDialog = new ProgressDialog(MainActivity.this);
  pDialog.setMessage("Wait...");
  pDialog.setIndeterminate(false);
  pDialog.setCancelable(true);
  pDialog.show();
  new UploadFileAsync().execute(String.valueOf(i));   
}

第三,上传完所有图片后关闭对话框:

if(i<imageList.size()){
  i++;
  new UploadFileAsync().execute(String.valueOf(i));
}
else {
  pDialog.dismiss();
}
statusWhenFinish(position, resServer);

答案 1 :(得分:0)

    package com.example.slideanim.temp;

    import java.io.ByteArrayOutputStream;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.List;

    import org.json.JSONException;
    import org.json.JSONObject;

    import android.app.Activity;
    import android.app.ProgressDialog;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.os.Environment;
    import android.os.Handler;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.ListView;
    import android.widget.TextView;

    import com.example.slideanim.R;

    public class MainActivity extends Activity {

        static ListView lstView;
        private Handler handler = new Handler();;
        static List<MyData> ImageList;
        String strPath;
        int position;
        File newFile;
        ViewHolder holder;
        View v;
        String fileName;
        ImageAdapter mAdapter;
        Button btnUploadAll;
        int i = 0;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            setContentView(R.layout.activity_main);

            btnUploadAll = (Button) findViewById(R.id.btnUploadAll);

            btnUploadAll.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    if (ImageList.size() != 0) {
                        new UploadFileAsync().execute(String.valueOf(i));
                    }
                }
            });

            /*** Get Images from SDCard ***/
            ImageList = getSD();
            // ListView and imageAdapter
            lstView = (ListView) findViewById(R.id.listView);
            mAdapter = new ImageAdapter(this);
            lstView.setAdapter(mAdapter);

        }

        private List<MyData> getSD() {
            List<MyData> it = new ArrayList<MyData>();
            String root_sd = Environment.getExternalStorageDirectory().toString();
            File f = new File(root_sd + "/mydata");
            File[] files = f.listFiles();
            for (int i = 0; i < files.length; i++) {
                File file = files[i];
                Log.d("Count", file.getPath());
                MyData data = new MyData();
                data.setImages(file.getPath());
                data.setStatusEnable(true);
                it.add(data);
            }
            return it;
        }

        static class ViewHolder {
            public ViewHolder(View convertView) {
                // TODO Auto-generated constructor stub
            }

            TextView textName;
            ImageView thumbnail;
            TextView textStatus;
            Button btnUpload;

        }

        public class ImageAdapter extends BaseAdapter {
            public ImageAdapter(Context c) {

            }

            public int getCount() {
                // TODO Auto-generated method stub
                return ImageList.size();
            }

            public Object getItem(int position) {
                // TODO Auto-generated method stub
                return position;
            }

            public long getItemId(int position) {
                // TODO Auto-generated method stub
                return position;
            }

            public View getView(final int position, View convertView,
                    ViewGroup parent) {
                // Avoid unneccessary calls to findViewById() on each row, which is
                // expensive!

                holder = null;

                if (convertView == null) {
                    convertView = getLayoutInflater().inflate(
                            R.layout.adapter_main, null);
                    holder = new ViewHolder(convertView);

                    // Create a ViewHolder and store references to the children
                    // views
                    holder.textName = (TextView) convertView
                            .findViewById(R.id.textName);
                    holder.thumbnail = (ImageView) convertView
                            .findViewById(R.id.thumbnail);
                    holder.btnUpload = (Button) convertView
                            .findViewById(R.id.btnUpload);
                    holder.textStatus = (TextView) convertView
                            .findViewById(R.id.textStatus);

                    // The tag can be any Object, this just happens to be the
                    // ViewHolder
                    convertView.setTag(holder);
                } else {
                    holder = (ViewHolder) convertView.getTag();
                }
                holder.btnUpload.setEnabled(ImageList.get(position)
                        .isStatusEnable());
                holder.textStatus.setText(ImageList.get(position).getMessage());
                strPath = ImageList.get(position).getImages().toString();

                // Get File Name
                fileName = strPath.substring(strPath.lastIndexOf('/') + 1,
                        strPath.length());
                File file = new File(strPath);
                @SuppressWarnings("unused")
                long length = file.length();
                holder.textName.setText(fileName);

                final BitmapFactory.Options options = new BitmapFactory.Options();

                Bitmap bm = BitmapFactory.decodeFile(strPath, options);
                holder.thumbnail.setImageBitmap(bm);

                // btnUpload
                holder.btnUpload.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        // Upload
                        startUpload(position);
                    }
                });

                return convertView;

            }
        }

        // Upload

        public void startUpload(final int position) {

            Runnable runnable = new Runnable() {

                public void run() {

                    handler.post(new Runnable() {

                        public void run() {
                            v = lstView.getChildAt(position
                                    - lstView.getFirstVisiblePosition());
                            holder = (ViewHolder) v.getTag();
                            synchronized (this) {
                                ImageList.get(position).setStatusEnable(false);
                                mAdapter.notifyDataSetChanged();
                            }

                            new UploadFileAsync().execute(String.valueOf(position));
                        }
                    });
                }
            };
            new Thread(runnable).start();
        }

        // Async Upload
        public class UploadFileAsync extends AsyncTask<String, Void, Void> {

            private ProgressDialog pDialog;
            String resServer;

            protected void onPreExecute() {
                super.onPreExecute();

                pDialog = new ProgressDialog(MainActivity.this);
                pDialog.setMessage("Wait...");
                pDialog.setIndeterminate(false);
                pDialog.setCancelable(true);
                pDialog.show();
            }

            @Override
            protected Void doInBackground(String... params) {
                if (ImageList == null || ImageList.size() == 0)
                    return null;

//below you need to change
                for (MyData myData : ImageList) {
                    // position = Integer.parseInt(params[0]);
                    int bytesRead, bytesAvailable, bufferSize;
                    byte[] buffer;
                    int maxBufferSize = 1 * 1024 * 1024;
                    int resCode = 0;
                    String resMessage = "";

                    String lineEnd = "\r\n";
                    String twoHyphens = "--";
                    String boundary = "*****";

                    // File Path
                    String strSDPath = myData.getImages().toString();

                    // Upload to PHP Script
                    String strUrlServer = "http://10.0.2.2/uploadFile.php";

                    try {
                        /** Check file on SD Card ***/
                        File file = new File(strSDPath);
                        if (!file.exists()) {
                            resServer = "{\"StatusID\":\"0\",\"Message\":\"Please check path on SD Card\"}";
                            return null;
                        }

                        FileInputStream fileInputStream = new FileInputStream(
                                new File(strSDPath));

                        URL url = new URL(strUrlServer);
                        HttpURLConnection conn = (HttpURLConnection) url
                                .openConnection();
                        conn.setDoInput(true);
                        conn.setDoOutput(true);
                        conn.setUseCaches(false);
                        conn.setRequestMethod("POST");

                        conn.setRequestProperty("Connection", "Keep-Alive");
                        conn.setRequestProperty("Content-Type",
                                "multipart/form-data;boundary=" + boundary);

                        DataOutputStream outputStream = new DataOutputStream(
                                conn.getOutputStream());
                        outputStream.writeBytes(twoHyphens + boundary + lineEnd);
                        outputStream
                                .writeBytes("Content-Disposition: form-data; name=\"filUpload\";filename=\""
                                        + strSDPath + "\"" + lineEnd);
                        outputStream.writeBytes(lineEnd);

                        bytesAvailable = fileInputStream.available();
                        bufferSize = Math.min(bytesAvailable, maxBufferSize);
                        buffer = new byte[bufferSize];

                        // Read file
                        bytesRead = fileInputStream.read(buffer, 0, bufferSize);

                        while (bytesRead > 0) {
                            outputStream.write(buffer, 0, bufferSize);
                            bytesAvailable = fileInputStream.available();
                            bufferSize = Math.min(bytesAvailable, maxBufferSize);
                            bytesRead = fileInputStream.read(buffer, 0, bufferSize);
                        }

                        outputStream.writeBytes(lineEnd);
                        outputStream.writeBytes(twoHyphens + boundary + twoHyphens
                                + lineEnd);

                        // Response Code and Message
                        resCode = conn.getResponseCode();
                        if (resCode == HttpURLConnection.HTTP_OK) {
                            InputStream is = conn.getInputStream();
                            ByteArrayOutputStream bos = new ByteArrayOutputStream();

                            int read = 0;
                            while ((read = is.read()) != -1) {
                                bos.write(read);
                            }

                            byte[] result = bos.toByteArray();
                            bos.close();

                            resMessage = new String(result);

                        }

                        Log.d("resCode=", Integer.toString(resCode));
                        Log.d("resMessage=", resMessage.toString());

                        fileInputStream.close();
                        outputStream.flush();
                        outputStream.close();

                        resServer = resMessage.toString();

                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
                return null;
            }

            protected void onPostExecute(Void unused) {
                statusWhenFinish(position, resServer);
                // dismiss the dialog once product deleted
                pDialog.dismiss();
            }

        }

        // When Upload Finish
        @SuppressWarnings("unused")
        protected void statusWhenFinish(int position, String resServer) {

            /*** Default Value ***/
            String strStatusID = "";
            String strError = "";

            try {

                JSONObject c = new JSONObject(resServer);
                strStatusID = c.getString("StatusID");
                strError = c.getString("Message");
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            // // prepare Status
            if (strStatusID.equals("0")) {
                ImageList.get(position).setMessage("Failed");
                ImageList.get(position).setStatusEnable(true);
                mAdapter.notifyDataSetChanged();

            } else if (strStatusID.equals("1")) {
                ImageList.get(position).setMessage("Already Exists");
                ImageList.get(position).setStatusEnable(false);
                mAdapter.notifyDataSetChanged();

            } else if (strStatusID.equals("2")) {
                ImageList.get(position).setMessage("Uploaded");
                ImageList.get(position).setStatusEnable(false);
                mAdapter.notifyDataSetChanged();
            } else {

            }

        }

        /**
         * Introduce a class with below attributes to hold a state of each row in
         * single element
         * 
         */
        public class MyData {
            /* Image url or path of image in single row */
            private String images;

            /* anme of image in single row */
            private String name;

            /* status ID of image in single row */
            private String statusID;

            /* message of image in single row */
            private String message;

            private boolean statusEnable;

            public boolean isStatusEnable() {
                return statusEnable;
            }

            public void setStatusEnable(boolean statusEnable) {
                this.statusEnable = statusEnable;
            }

            // Generate getters and setter
            public String getImages() {
                return images;
            }

            public void setImages(String images) {
                this.images = images;
            }

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            public String getStatusID() {
                return statusID;
            }

            public void setStatusID(String statusID) {
                this.statusID = statusID;
            }

            public String getMessage() {
                return message;
            }

            public void setMessage(String message) {
                this.message = message;
            }

        }

    }

答案 2 :(得分:0)

在上传第一张图片时显示pDialog,在上传最后一张图片时,请关闭pDialog。

ProgressDialog pDialog;

public void showProgressDialog(){

    pDialog = new ProgressDialog(MainActivity.this);
    pDialog.setMessage("Wait...");
    pDialog.setIndeterminate(false);
    pDialog.setCancelable(true);
    pDialog.show();
}

public void onPreExecute(..){

if(pDialog==null)
  showProgressDialog()
}

public void onPostExecute(..){
.....
.......
if(i==imageList.size(){
   if(pDialog!=null) pDialog.dismiss();
}

答案 3 :(得分:0)

您可以使用asyntask进行延迟加载并首次上传所有图像并将其保存在SD卡或表格中,如果您第二次访问它,则从SD卡或表格检查条件是否全部可用并从中使用SD卡或桌子 http://codehenge.net/blog/2011/06/android-development-tutorial-asynchronous-lazy-loading-and-caching-of-listview-images/