0

Web サービスのリクエストからの応答を待っている間にプログレス バーを表示したい。ただし、この間、Android プログレス バーは読み込まれません。

 public class WebService extends Activity {

          private static final String NAMESPACE="http://tempuri.org/";
          private static final String METHOD_NAME="AddEmployee";
          private static final String URL="http://10.32.4.24/Android/AndroidBus.svc";
          private static final String SOAP_ACTION="http://tempuri.org/IAndroidBus/AddEmployee";

          String celsius;
          Button b;
          TextView tv;
          EditText et;
          String res,resultval;

          @Override
         protected void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             setContentView(R.layout.activity_web_service);

             et=(EditText)findViewById(R.id.editText1);        
             tv=(TextView)findViewById(R.id.Result);
             b=(Button)findViewById(R.id.button1);
             b.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                   new service().execute();
                }
          });
    }

    private class service extends AsyncTask<Void, Void, String> {
         ProgressDialog pd;
         protected void onPreExecute(){
             pd=new ProgressDialog(getBaseContext());
             pd.show();
         }
        @Override
        protected String doInBackground(Void... arg0) {
            System.out.println("In DoIn Background");

            // Initialize soap request + add parameters
            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

            PropertyInfo pi=new PropertyInfo();
            pi.setName("Name");
            pi.setValue(et.getText().toString());
            request.addProperty(pi);

                        // Declare the version of the SOAP request
            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            envelope.setOutputSoapObject(request);
            envelope.dotNet = true;
            setProgress(1);

            try {
                HttpTransportSE androidHttpTransport = new HttpTransportSE( URL);

                // this is the actual part that will call the webservice
                androidHttpTransport.debug=true;
                androidHttpTransport.call(SOAP_ACTION, envelope);

                String resdump=androidHttpTransport.responseDump.toString();
                System.out.println(resdump);
                setProgress(2);
                // Get the SoapResult from the envelope body.
                //SoapObject result = (SoapObject) envelope.bodyIn;
                SoapPrimitive result=(SoapPrimitive)envelope.getResponse();
                setProgress(3);
                if (result != null) {
                    // Get the first property and change the label text
                    // txtFar.setText(result.getProperty(0).toString());
                    res = result.toString();
                } else {
                    Toast.makeText(getApplicationContext(), "No Response",
                            Toast.LENGTH_LONG).show();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            return res;

        }

        protected void onPostExecute(String h) {
            String result = h;
            pd.dismiss();
            tv.setText(result + "°F");

        }

    }


}

リクエスト/レスポンスの送受信中にプログレスバーを表示したい。

4

5 に答える 5

3

あなたがやろうとしていることは間違っています。SoapSerializationEnvelope、HttpTransportSE、および Result の間の進行状況セットは、HttpTransportSE.call(...) 内で膨大な作業が行われるため意味がありません。送受信されるバイト数に本当にダウンロード/アップロードの進行状況バーが必要な場合は、HttpTrasportSE クラスを変更する必要があります。具体的には、このクラスの call() と read() を変更する必要があります。

ここ (HttpTransportSE.java)でわかるように、たとえば、アップロードの進行状況を実装するには、HttpTransportSE を作成し、元のコードをすべてコピーして、この部分を変更する必要があります。

public List call(String soapAction, SoapEnvelope envelope, List headers, File outputFile) throws IOException, XmlPullParserException {
(...)
OutputStream os = connection.openOutputStream();
os.write(requestData, 0, requestData.length);
os.flush();
os.close();
(...)

これに(私は一般的なProgressDialogを考えました):

public List call(String soapAction, SoapEnvelope envelope, List headers, File outputFile, ProgressDialog dialog)
    throws IOException, XmlPullParserException {
    (...)

    if(dialog != null)
        {
            dialog.setIndeterminate(false);
            dialog.setProgress(0);

            InputStream iss = new ByteArrayInputStream(requestData, 0, requestData.length);

            int byteCount = 0;
            byte[] buf = new byte[256];
            while (true) 
            {
                int rd = iss.read(buf, 0, 256);
                byteCount += rd;
                if (rd == -1)
                    break;
                os.write(buf, 0, rd);

                dialog.setProgress((int) (((float)byteCount/(float)requestData.length)*100));
            }
            dialog.setIndeterminate(true);

            iss.close();
            buf = null;
        }
        else
            os.write(requestData, 0, requestData.length);

        os.flush();
        os.close();
(...)

ご覧のとおり、call メソッドをオーバーライドして新しいパラメーター (目的に応じて ProgressDialog または ProgressBar タイプ) を追加し、それをダイアログ/バーに渡す必要があります (「null」を渡すと、デフォルトのロジックが考慮されます)。プログレスバーに実際の進行状況を表示したい場合は、これが唯一の方法です (ksoap2 による)。

ダウンロードの場合も、ロジックは同じです。ダウンロードが管理されているコードの部分を見つけ、応答ヘッダーから読み取ることができる Content-Length 値をどこかに保存し、以前に保存された content-length を考慮してバイトを読み取るための同様のアップロード「while」サイクルを実装します。

この説明がお役に立てば幸いです

于 2013-12-06T11:43:45.817 に答える
0

進行状況ダイアログにメッセージを設定してみてください。

protected void onPreExecute(){
         pd=new ProgressDialog(WebService.this);
         pd.setMessage("Loading...");
         pd.setIndeterminate(true);
         pd.show();
     }
于 2012-12-13T07:48:58.390 に答える
0

ここで別のコンテキスト オブジェクトを試す必要があります。

これの代わりに、

 ProgressDialog(getBaseContext());

試す

 ProgressDialog(ActivityName.this);
于 2012-12-13T07:49:01.837 に答える
0

setProgress 呼び出しが何をするのかわかりませんが、進行状況ダイアログを更新すると仮定すると、asynctask を実装させる必要があります

 protected void onProgressUpdate(Integer... progress) {
     setProgress(progress);
 }

代わりpublishProgress(2);にあなたを呼びますdoInBackgroundsetProgress

これは、別のスレッドで実行される doInBackGround メソッドで UI 要素を更新できないためです。これを行うと、ダイアログが更新されないだけでなく、アプリケーションが壊れる可能性があります。

于 2012-12-13T07:49:45.360 に答える
0

4 つのステップ、さあ、始めましょう..

(1)。アクティビティで進行状況ダイアログを宣言する

private ProgressDialog dialog = null;

(2)。AsyncTask クラスの開始時にダイアログを開始する

dialog = ProgressDialog.show(CurrentActivity.this, "", "loading..");

例えば。

dialog = ProgressDialog.show(CurrentActivity.this, "", "loading search..");

SearchTask task= new GetSearchSeedsData();
task.execute(urlString);

(3)。AsyncTask クラスの doInBackground() メソッドで重い作業 (Web サービスまたはその他) を実行します。

(4)。次に、AsyncTask クラスの onPostExecute() で進行状況ダイアログを閉じます

dialog.dismiss();
于 2012-12-13T07:53:40.933 に答える