下载从列表视图中重新开始

时间:2016-03-29 18:58:13

标签: java android listview android-asynctask downloading

我正在使用AsyncTask和arrayList创建一个多下载器。我希望我的Android应用程序在我的应用程序的后台下载视频。这就是我创建应用程序类并在那里初始化我的下载arraylist的原因。我的下载列表视图正在完美地添加新项目,但是当添加新项目时,无论是完全下载还是部分下载,之前的项目都会开始再次下载。

这是我的应用程序类:

public class GlobalDownload extends Application {


    private List<DownloadInfo> downloadinfo;

    @Override
    public void onCreate() {
        super.onCreate();
        downloadinfo = new ArrayList<DownloadInfo>();


    }


    public List<DownloadInfo> getDownloadInfo(){
        return downloadinfo;
    }
    public String getDownloadStates()
    {
        return state;
    }
}

以下是我的课程,其中列出了listview:

public class DownloadScreen extends Activity implements {
  ListView listView;

    Animation animationslidedown;
    Animation animationslideup;
    TextView textView2;

    ImageView menu;
    ImageView menuicon1;
    String text="";
    List<DownloadInfo> downloadInfo;
     static final int REQUEST = 1;
    public static String f_type;
    public static Integer result;
    DownloadInfoArrayAdapter adapter;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.download_layout);


        listView = (ListView) findViewById(R.id.downloadListView);
        String file_name=getIntent().getStringExtra("FILE_NAME");



        String file_type=getIntent().getStringExtra("FILE_TYPE").toString();
        Log.e("file_type", "" + file_type);

        if(file_type.equals("video/mp4"))
        {
            f_type="mp4";
        }
        else if(file_type.equals("video/webm"))
        {
            f_type="webm";
        }
        else if(file_type.equals("video/x-flv"))
        {
            f_type="flv";
        }
        else if(file_type.equals("video/3gpp"))
        {
            f_type="3gpp";
        }



        GlobalDownload downloadList = ((GlobalDownload)getApplicationContext());
        ArrayList downloadState = (ArrayList) downloadList.getDownloadInfo();

        Log.e("NAME", "" + file_name);

        String file_url=getIntent().getStringExtra("FILE_URL");
        Log.e("URL", "" + file_url);
        String file_size=getIntent().getStringExtra("FILE_SIZE");
        Log.e("SIZE", "" + file_size);
        Log.e("TYPE", file_type.toString());
        downloadState.add(new DownloadInfo(file_name,file_url,file_size,f_type.toString()));

        listView.setAdapter(new DownloadInfoArrayAdapter(getApplicationContext(), R.id.downloadListView, downloadState));
    }

}

以下是我的AsyncTask活动和ArrayAdapeter活动:

public class FileDownloadTask extends AsyncTask<String, Integer, Integer> {
   // private static final String    TAG = FileDownloadTask.class.getSimpleName();
    final DownloadInfo  mInfo;
    TextView display;
    public int progress;
    public  String encodedurl;



    DownloadInfoArrayAdapter mAdapter;

    public FileDownloadTask(DownloadInfo info) {
        mInfo = info;

    }

     @Override
    protected void onProgressUpdate(Integer... values) {
        mInfo.setProgress(values[0]);
        mInfo.setFilePercent(values[0]);
        ProgressBar bar = mInfo.getProgressBar();


        if (bar != null) {
            bar.setProgress(mInfo.getProgress());

        }


    }



    @Override

    protected Integer doInBackground(String... params) {
        int count;

       if(mInfo.getDownloadState()!= DownloadInfo.DownloadState.COMPLETE)
       {
            try {
                String root = Environment.getExternalStorageDirectory().toString();

                System.out.println("Downloading");
//

                URL url = new URL(mInfo.getFileUrl().toString());
                Log.e("URL", "" + url);
                HttpURLConnection conection = (HttpURLConnection) url.openConnection();
                conection.connect();
                Log.e("connection", " " + 0);

                int lenghtOfFile = conection.getContentLength();

                Log.e("length", "" + lenghtOfFile);
                //input stream to read file - with 8k buffer

                // Output stream to write file
                File rootdirectory = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES), "Youtube Videos");
                if (!rootdirectory.exists()) {
                    rootdirectory.mkdirs();
                }

                String nameoffile = mInfo.getFilename() + "." + mInfo.getFileType();
                File file = new File(rootdirectory, nameoffile);
                file.createNewFile();
                Log.e("name of file", "" + nameoffile);


                mInfo.setDownloadState(DownloadInfo.DownloadState.DOWNLOADING);
                InputStream input = new BufferedInputStream(url.openStream(), 8192);

                OutputStream output = new FileOutputStream(file);
                byte data[] = new byte[1024];

                long total = 0;
                while ((count = input.read(data)) != -1) {
                    total += count;
                    progress = (int) ((total * 100) / lenghtOfFile);
                    publishProgress(progress);
                    Log.e("PROGRESS", "" + mInfo.getFileType() + progress);
                    mInfo.setFilePercent(progress);



                    // writing data to file
                    output.write(data, 0, count);

                }

                // flushing output
                output.flush();

                // closing streams
                output.close();
                input.close();
                Log.e("Download Complete", "" + 0);

            } catch (Exception e) {
                Log.e("Error: ", e.getMessage());
            }
            mInfo.setDownloadState(DownloadInfo.DownloadState.COMPLETE);

       }


        return progress;
    }




    protected void onPostExecute(Integer progress) {
        mInfo.setDownloadState(DownloadInfo.DownloadState.COMPLETE);
        }

    @Override
    protected void onPreExecute() {
        mInfo.setDownloadState(DownloadInfo.DownloadState.DOWNLOADING);
    }



}

这是我的调用AsyncTask的Adapter类

public class DownloadInfoArrayAdapter extends ArrayAdapter<DownloadInfo> {
    public static TextView progpercent;

    public static Integer result;


    private static class ViewHolder {
        TextView textView;
        ProgressBar progressBar;
        Button button;
        DownloadInfo info;
        TextView size;
        TextView prog;
        public TextView progpercent;
    }


    private static final String TAG = DownloadInfoArrayAdapter.class.getSimpleName();

    public DownloadInfoArrayAdapter(Context context, int textViewResourceId,
                                    List<DownloadInfo> objects) {
        super(context, textViewResourceId, objects);



    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View row = convertView;


        final DownloadInfo info = getItem(position);



        ViewHolder holder = null;

        if(null == row) {
            LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.file_download_row, parent, false);

            holder = new ViewHolder();
            holder.textView = (TextView) row.findViewById(R.id.downloadFileName);
            holder.progressBar = (ProgressBar) row.findViewById(R.id.downloadProgressBar);
            holder.size=(TextView) row.findViewById(R.id.downloadFileSize);
            holder.progpercent=(TextView) row.findViewById(R.id.downloadFileProgress);


            row.setTag(holder);
        } else {
            holder = (ViewHolder) row.getTag();
         }

        holder.textView.setText(info.getFilename());
        holder.progressBar.setProgress(info.getProgress());
        holder.progressBar.setMax(100);
        holder.size.setText(info.getFileSize());

        info.setProgressBar(holder.progressBar);

        info.setDownloadState(DownloadInfo.DownloadState.QUEUED);

        FileDownloadTask task = new FileDownloadTask(info);
        task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);



        return row;
    }



}

这是我的列表活动

public class DownloadInfo
{
private final static String TAG = DownloadInfo.class.getSimpleName();
public enum DownloadState {
    NOT_STARTED,
    QUEUED,
    DOWNLOADING,
    COMPLETE
}
private volatile DownloadState mDownloadState = DownloadState.NOT_STARTED;
private  String mFilename;
private  String mFileSize;
private  String mFileUrl="";
private volatile Integer mProgress;
private volatile ProgressBar mProgressBar;
private Integer mFilePercent;
    private String mFileType;
    private Integer mSize;

    public DownloadInfo(String filename, String FileUrl, String size, String type) {
        mFilename = filename;
        mProgress = 0;
        mFileUrl = FileUrl;
        mFilePercent=0;
        mSize = 0;
        mFileType= type;
        mFileSize = size;
        mProgressBar = null;
    }

    public ProgressBar getProgressBar() {
        return mProgressBar;
    }
    public void setProgressBar(ProgressBar progressBar) {
        Log.d(TAG, "setProgressBar " + mFilename + " to " + progressBar);
        mProgressBar = progressBar;
    }

    public void setDownloadState(DownloadState state) {
        mDownloadState = state;
    }
    public DownloadState getDownloadState() {
        return mDownloadState;
    }

    public Integer getProgress() {
        return mProgress;
    }

    public void setProgress(Integer progress) {
        this.mProgress = progress;
    }


    public String getFileType() {
        return mFileType;
    }

    public void setFileType(String FileType) {
        mFileType = FileType;
    }
    public Integer getSize() {
        return mSize;
    }

    public void setSize(Integer FSize) {
        mSize = FSize;
    }
    public String getFileSize() {
        return mFileSize;
    }

    public void setFileSize(String FileSize) {
        mFileSize = FileSize;
    }


    public Integer getFilePercent() {
        return mFilePercent;
    }

    public void setFilePercent(Integer FilePercent) {
        mFilePercent = FilePercent;
    }

    public String getFilename() {
        return mFilename;
    }
    public String getFileUrl()
    {
        return mFileUrl;
    }
}

请帮助!

1 个答案:

答案 0 :(得分:2)

在适配器类中设置:

info.setDownloadState(DownloadInfo.DownloadState.QUEUED);

这意味着在下一个getView调用中,即使之前已经下载了因为重置状态,也会运行该文件的下载。

您可以检查适配器中的状态,而不是AsyncTask。