2016-03-29 15 views
0

AsyncTask ve arrayList.I kullanarak çoklu bir yükleyici yapıyorum Uygulamamın arka planında android uygulamasının videoları indirmesini istiyorum. Bu yüzden bir uygulama sınıfı oluşturdum ve download arraylistimi orada başlattım. İndirme listemim yeni öğeleri mükemmel şekilde ekliyor, ancak yeni bir öğe eklendiğinde, tamamen indirilmiş veya kısmen indirilmiş olsun önceki öğe yeniden indirilmeye başlar. İşte İndirme yeniden başlatılıyor liste görünümünde

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 doldurulur oluyor benim sınıftır: Burada

başvurum sınıftır

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



} 

: Burada

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

} 

benim AsyncTask faaliyet ve ArrayAdapeter Etkinlik vardır İşte AsyncTask'ın

olarak adlandırıldığı Adaptör sınıfım
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; 
    } 



} 

İşte benim Liste Etkinlik

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

Yardım Lütfen olduğu! adaptör sınıfta

cevap

2

ayarladığınız:

info.setDownloadState(DownloadInfo.DownloadState.QUEUED); 

Önümüzdeki GetView üzerinde size devlet Sıfırlanmasını çünkü daha önce dowloaded olsa bile dosyanın indirilmesini çalışacağı çağrı anlamına gelir.

Adaptördeki durumu AsyncTask'ta değilde kontrol edebilirsiniz.

+0

ok. Bunu "info.setDownloadState (DownloadInfo.DownloadState.QUEUED)" adaptöründen kaldırdım; ve ben adaptörü bu koşulu eklendi "if (info.getDownloadState()! = DownloadInfo.DownloadState.COMPLETE || info.getDownloadState()! = DownloadInfo.DownloadState.DOWNLOADING) { info.setDownloadState (DownloadInfo .DownloadState.QUEUED); FileDownloadTask görev = new FileDownloadTask (bilgi); task.executeOnExecutor (AsyncTask.THREAD_POOL_EXECUTOR); }" aynı şey Tamam –

+0

oluyor , benim ArrayAdapter bu yazdım ve şimdi çalışıyor .. "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); } " Çok teşekkürler –

İlgili konular