2013-02-04 24 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が起動する前にProgressBarをビューに追加し(インフレして追加する)、AsyncTaskコンストラクターでVisibleにする必要があります。また、ProgressBarへの参照をAsyncTask(または何らかの形でスコープ内で非静的な内部クラスによって)に格納する必要があります。あなたのAsyncTaskはこのように見ている必要があります最終的には

(プログレスバーを想定したが、すでにビューに装着されている):また

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

関連する問題