2013-02-04 10 views
6

मेरे पास एक परिदृश्य है, मेरे चैट एप्लिकेशन में मैं फोटो भेजना चाहता हूं, फ़ोटो भेजने में समय लगता है। मैंने अपने आवेदन में फोटो भेजने की प्रगति दिखाने के लिए एक प्रगति पट्टी (क्षैतिज) संलग्न की है। लेकिन मैं प्रगति पट्टी को अपडेट करने में असमर्थ हूं क्योंकि यह कस्टम सूची दृश्य का आइटम है।सूची दृश्य में प्रगति पट्टी को अद्यतन करना

प्रगति पट्टी के लिए प्रगति सेट करने के लिए मेरा एसिंचटास्क यहां है लेकिन मैं इसे प्राप्त करने में सक्षम नहीं हूं।

class SendPhotoToFriend extends AsyncTask<String, String, String>{ 

     String receiver,path = ""; 

     public SendPhotoToFriend(String path,String receiver) { 
      // TODO Auto-generated constructor stub 

      this.path = path; 
      this.receiver = receiver; 

     } 


     @Override 
     protected String doInBackground(String... arg0) { 
      // TODO Auto-generated method stub 

      ServiceDiscoveryManager sdm = ServiceDiscoveryManager 
      .getInstanceFor(connection); 

      if (sdm == null) 
       sdm = new ServiceDiscoveryManager(connection); 

      sdm.addFeature("http://jabber.org/protocol/disco#info"); 
      sdm.addFeature("jabber:iq:privacy"); 

      // Create the file transfer manager 
      FileTransferManager manager = new FileTransferManager(
        connection); 
      FileTransferNegotiator.setServiceEnabled(connection, true); 

      // Create the outgoing file transfer 
      OutgoingFileTransfer transfer = manager 
      .createOutgoingFileTransfer(receiver + "/Smack"); 

      System.out.println("Receiver of the file is "+receiver+"/smack"); 

      Log.i("transfere file", "outgoingfiletransfer is created"); 

      try { 
       long total = 0; 

       OutgoingFileTransfer.setResponseTimeout(30000); 
       transfer.sendFile(new File(path), "Description"); 
       Log.i("transfere file", "sending file"); 
       while (!transfer.isDone()) { 
        //Thread.sleep(1000); 

        total+=transfer.getProgress(); 

        publishProgress(""+(int)((total*100)/transfer.getFileSize())); 

        Log.i("transfere file", "sending file status " 
          + transfer.getStatus() + "progress: " 
          + transfer.getProgress()); 
        if (transfer.getStatus() == org.jivesoftware.smackx.filetransfer.FileTransfer.Status.error) { 
         Log.i("transfere file", "Errorrr isss: " 
           + transfer.getError()+transfer.getPeer()); 
         transfer.cancel(); 
         break; 
        } 
       } 

      } catch (XMPPException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      Log.i("transfere file", "sending file done"); 

      return null; 
     } 

     @Override 
     protected void onProgressUpdate(final String... values) { 
      // TODO Auto-generated method stub 
      super.onProgressUpdate(values); 


      LayoutInflater inflater = (LayoutInflater)getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      final View view =inflater.inflate(R.layout.user_chat_send_chat, null); 
      ProgressBar p_Bar = (ProgressBar)view.findViewById(R.id.progress_bar_image); 
      p_Bar.setProgress(Integer.parseInt(values[0])); 

      customAdapter1.notifyDataSetChanged(); 



     } 

     @Override 
     protected void onPostExecute(String result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 
     } 
    } 

प्रगति बार कस्टम सूची दृश्य का दृश्य है, मैं इसे रन टाइम पर अपडेट करना चाहता हूं।

धन्यवाद

उत्तर

7

आप onProgress कॉलबैक भीतर ProgressBar बढ़ा-चढ़ाकर कर रहे हैं। यह बिल्कुल गलत है। आपके AsyncTask शुरू होने से पहले प्रोग्रेसबार को दृश्य में जोड़ा जाना चाहिए (फुलाएं और जोड़ें) और फिर इसे अपने AsyncTask कन्स्ट्रक्टर में दृश्यमान बनाने के लिए चालू करें। आपको AsyncTask (या किसी भी तरह गैर-स्थैतिक आंतरिक वर्ग द्वारा गुंजाइश में) प्रोग्रेसबार का संदर्भ भी संग्रहीत करना चाहिए।

अंत अपने AsyncTask इस तरह लग रही किया जाना चाहिए में (ProgressBar संभालने पहले से ही दृश्य से जुड़ा हुआ है):

class SendPhotoToFriend extends AsyncTask<String, String, String> { 

    String receiver,path = ""; 

    ProgressBar progress; 

    public SendPhotoToFriend(String path, String receiver, ProgressBar progress) { 
     this.path = path; 
     this.receiver = receiver; 
     this.progress = progress; 
     this.progress.setVisibility(View.Visible); 
    } 


    @Override 
    protected String doInBackground(String... arg0) { 
     // You're application logic... 
     // ... 
     publishProgress((int)((total*100)/transfer.getFileSize())); 
     // ... 
    } 

    @Override 
    protected void onProgressUpdate(final Integer... values) { 
     this.progress.setProgress(values[0]); 
    } 
} 

इसके अलावा, आप की जरूरत नहीं है (और नहीं होना चाहिए) में adapter.notifiyDataSetChanged() फोन अपने onProgres-कॉलबैक।

+0

क्या मुझे इसे getView विधि से कॉल करना चाहिए? –

+0

यह निर्णय आपके ऐप के सॉफ़्टवेयर आर्किटेक्चर पर बहुत निर्भर करता है। कोई गलत या सही नहीं है। यह और अधिक है जहां यह आपके AsyncTask को कॉल करने के लिए और अधिक समझ में आता है .. मुझे डर है कि मैं आपके लिए इस प्रश्न का उत्तर नहीं दे सकता। – Taig

+0

ठीक है धन्यवाद। मैं इसे देख लूंगा और आपको वापस कर दूंगा –

0

मैं प्रत्येक सूची आइटम दृश्य एक प्रगति बार है लगता है, यदि यह मामला है, तो आप getView उपयोग कर सकते हैं कि स्थिति के लिए दृश्य प्राप्त करने, और फिर कहते हैं:

 View view = customAdapter1.getView(position, convertView, parent); 
     ProgressBar p_Bar = (ProgressBar)view.findViewById(R.id.progress_bar_image); 
     p_Bar.setProgress(Integer.parseInt(values[0])); 

customAdapter1 कॉल करने के लिए कोई ज़रूरत नहीं। notifyDataSetChanged();

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