2011-08-17 13 views
6

मुझे एक अजीब समस्या है, जब भी मुझे वेबब्रोसर पर एक एमपी 3 फ़ाइल मिलती है, और प्रत्येक AsyncTask के लिए सूची दृश्य में प्रगति पट्टी लॉन्च करता है, तो मेरे पास एक नया एसिंक्टास्क लॉन्च होता है। तो डाउनलोड की संख्या 1 से अधिक और एक साथ हो सकती है। लेकिन अब जब भी Asynctask launced है ProgressBar सभी के लिए समान और विभिन्न AsyncTask के लिए अलग नहीं, Plz मुझे मार्गदर्शन ले जाता है .......सूचीदृश्य में प्रगति पट्टी, जबकि AsyncTask फ़ाइल डाउनलोड करें

LISTVIEW WITH PROGRESS BAR

public class CopyOfDownloadsListActivity extends ListActivity { 
    /** Called when the activity is first created. */ 

// static ArrayList<String> pthreads = new ArrayList<String>(); 
ImageView bt; 
ProgressBar pb; 
ListView allList; 
TextView tv; 
String fileName; 
String mp3URL; 
    URL url2; 
    int filecount = 0; 

private class DownloadFile extends AsyncTask<String, Integer, Void>{ 
    MyCustomAdapter adapter; 

    int count = 0; 
    ProgressDialog dialog; 
    ProgressBar progressBar; 
    int myProgress; 

    @Override   
    protected Void doInBackground(String... u) {   
     try {     
      URL ul = new URL(u[0]); 
      Log.i("UI",ul.toString()); 
     // int len = CopyOfMusicDownloader.mp3urls.size(); 
     // URL url2 = new URL(CopyOfMusicDownloader.mp3urls.get(len-1)); 
      HttpURLConnection c = (HttpURLConnection) ul.openConnection(); 
      c.setRequestMethod("GET"); 
      c.setDoOutput(true); 
      c.connect(); 

      int lengthOfFile = c.getContentLength(); 

      String PATH = Environment.getExternalStorageDirectory() 
        + "/download/"; 
      Log.v("", "PATH: " + PATH); 
      File file = new File(PATH); 
      file.mkdirs(); 

      fileName = "Track"; 
      filecount++; 

      fileName = fileName + Integer.toString(filecount) + ".mp3"; 


      File outputFile = new File(file, fileName); 
      FileOutputStream fos = new FileOutputStream(outputFile); 
      InputStream is = c.getInputStream(); 

      byte[] buffer = new byte[1024]; 
      int len1 = 0;  
      while ((len1 = is.read(buffer)) != -1) { 
       myProgress = (int)((len1/lengthOfFile)*100); 
       myProgress = myProgress + myProgress; 
       Log.i("lengthOfFile", Integer.toString(lengthOfFile)); 
       Log.i("My Progress", Integer.toString(myProgress)); 
       publishProgress(myProgress); 
       fos.write(buffer, 0, len1); 
      } 
      fos.close(); 
      is.close(); 

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

    protected void onPostExecute() { 
    } 

    @Override 
    protected void onPreExecute() {   
      adapter = new MyCustomAdapter(CopyOfDownloadsListActivity.this, R.layout.row, CopyOfMusicDownloader.mp3urls); 
      setListAdapter(adapter); 
    } 



    @Override 
    protected void onProgressUpdate(Integer... values) { 
     Log.i("Value", values[0].toString()); 
     count++; 
     adapter.notifyDataSetChanged(); 
    } 


    public class MyCustomAdapter extends ArrayAdapter<String> {  
     public MyCustomAdapter(Context context, int textViewResourceId, ArrayList<String> pthreads) { 
     super(context, textViewResourceId, pthreads); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
       LayoutInflater inflater = getLayoutInflater(); 
       View row = inflater.inflate(R.layout.row, parent, false); 
       bt =(ImageView)row.findViewById(R.id.cancel_btn); 
       tv =(TextView)row.findViewById(R.id.filetext); 
       pb = (ProgressBar)row.findViewById(R.id.progressbar_Horizontal); 
       pb.setProgress(count); 
       return row; 
      } 
     }  
} 

यह AsyncTask शुरू है, और इसके onCreate नया डाउनलोडफाइल() निष्पादित करें (url2.toString());

उत्तर

3

आपका मुद्दा यह static ProgressBar pb;

आप किसी एक स्थिर संदर्भ नहीं हो सकता है और कई प्रगति सलाखों को नियंत्रित करने की उम्मीद है। AsyncTask के अंदर प्रोग्रेसबार को पूरी तरह से encapsulate, इसे एक आवृत्ति चर बनाओ।

संपादित

onProgressUpdate में आप ProgressBar की प्रगति को बदलने की जरूरत। आपको हर पंक्ति के लिए एडाप्टर की आवश्यकता नहीं है, यह अपर्याप्त है।

@Override 
    protected void onProgressUpdate(Integer... values) { 
     Log.i("Value", values[0].toString()); 
     count++; 
     progressBar.setProgress(count); 
    } 

तुम भी एक मूल्य Progressbar आवंटित कभी नहीं, आप pb आकलन रखने के लिए, कि चर से छुटकारा पाने के! आप में प्रीएक्सक्यूट करें आप सूची के एडाप्टर को पुन: असाइन करते रहें।

आपको बहुत सारे संशोधनों की आवश्यकता है। एक एकल एडाप्टर बनाएं जो सूचीदृश्य प्रबंधित करता है। प्रत्येक पंक्ति में एक AsyncTask हो सकता है जो अपनी प्रगति पट्टी, छवि दृश्य और टेक्स्ट व्यू को बनाए रखता है।

+0

धन्यवाद मैंने इसे हटा दिया, लेकिन फिर भी समस्या बनी हुई है ....... :( – Programmer

4

इसके अलावा, अमल पर नोट्स() यहाँ पढ़ें:

http://developer.android.com/reference/android/os/AsyncTask.html#execute%28Params...%29

हनीकोम्ब के बाद वहाँ केवल एक धागा सभी ASyncTasks चल तो आप शायद एक से अधिक एक साथ नहीं चल सकता हो जाएगा। पहले के बाद, बाकी कतारबद्ध हो जाएंगे और पहले तक खत्म होने तक निष्पादित नहीं होंगे। आपको शायद थ्रेड में प्रत्येक डाउनलोड करने की आवश्यकता होगी और उन सभी की निगरानी के लिए एक एकल ASyncTask का उपयोग करें। (आप थ्रेड से भी निगरानी कर सकते हैं लेकिन UI थ्रेड पर UI को अपडेट पोस्ट करने के लिए आपको अतिरिक्त कदम उठाने की आवश्यकता है)।

+0

यह इंगित करने के लिए धन्यवाद, मुझे नहीं पता था कि वे इसे डिफ़ॉल्ट रूप से एक सीरियल पूल में बदल रहे थे। – smith324

+0

एनपी - बस इसे अपने आप को कठिन तरीके से सीखा :) – Fraser

+1

कठिन तरीका? दस्तावेज़ कहते हैं कि इसे अभी तक वापस नहीं बदला गया है। – smith324

संबंधित मुद्दे