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

プログレス バーは、カスタム リスト ビューのビューです。実行時に更新したいと考えています。

ありがとう

4

2 に答える 2

7

onProgress コールバック内で ProgressBar を膨らませています。これは絶対に間違っています。ProgressBar は、AsyncTask を開始する前にビューに追加し (膨張させて追加)、AsyncTask コンストラクターで表示できるようにする必要があります。また、ProgressBar への参照を 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-Callback を呼び出す必要はありません (すべきではありません) 。

于 2013-02-07T05:09:09.453 に答える
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();を呼び出す必要はありません。

于 2013-02-14T03:17:43.247 に答える