2016-03-29 7 views
0

Ich mache einen Multi-Downloader mit AsyncTask und ArrayList.Ich möchte meine Android-Anwendung Videos im Hintergrund meiner App herunterladen. Deshalb habe ich eine Anwendungsklasse erstellt und dort meine Download-Arraylist initialisiert. Meine Download-Listenansicht fügt neue Elemente perfekt hinzu, aber wenn ein neues Element hinzugefügt wird, wird das vorherige Element, ob es vollständig heruntergeladen oder teilweise heruntergeladen wurde, erneut heruntergeladen.Download Wiederbeginn in Listview

Hier ist meine Anwendungsklasse:

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

Hier ist meine Klasse, wo Listenansicht bevölkert wird immer:

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

} 

Hier sind meine AsyncTask Aktivität und ArrayAdapeter Aktivität:

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



} 

Hier ist meine Adapter-Klasse, von der AsyncTask

aufgerufen wird
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; 
    } 



} 

Hier ist meine Liste Aktivität

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

Bitte um Hilfe!

Antwort

2

In Ihrer Adapter Klasse, die Sie festgelegt:

info.setDownloadState(DownloadInfo.DownloadState.QUEUED); 

Es bedeutet, dass auf dem nächsten getView nennen Sie das Herunterladen der Datei ausgeführt werden, auch wenn es vor dowloaded wurde, weil Sie den Zustand Reseting.

Sie können den Status im Adapter nicht in der AsyncTask überprüfen.

+0

ok. Ich habe das vom Adapter "info.setDownloadState (DownloadInfo.DownloadState.QUEUED)" entfernt; und ich hinzugefügt, um diese Bedingung in dem Adapter „if (info.getDownloadState()! = DownloadInfo.DownloadState.COMPLETE || info.getDownloadState()! = DownloadInfo.DownloadState.DOWNLOADING) { info.setDownloadState (DownloadInfo .DownloadState.QUEUED); FileDownloadTask Aufgabe = new FileDownloadTask (info); task.executeOnExecutor (AsyncTask.THREAD_POOL_EXECUTOR); }“ Das gleiche geschieht –

+0

Ok, ich schrieb dies in meinem ArrayAdapter und es funktioniert jetzt .. "if (info.getDownloadState()! = DownloadInfo.DownloadState.COMPLETE && info.g etDownloadState()! = DownloadInfo.DownloadState.DOWNLOADING) {info.setDownloadState (DownloadInfo.DownloadState.QUEUED); FileDownloadTask task = new FileDownloadTask (info); task.executeOnExecutor (AsyncTask.THREAD_POOL_EXECUTOR); } " Vielen Dank –