android解決UI阻塞問題——建立AsyncTask 子線程

來源:互聯網
上載者:User

view plaincopy to clipboardprint?<br />package net.blogjava.mobile.wsclient; </p><p>import org.ksoap2.SoapEnvelope;<br />import org.ksoap2.serialization.SoapObject;<br />import org.ksoap2.serialization.SoapSerializationEnvelope;<br />import org.ksoap2.transport.HttpTransportSE;<br />import android.app.Activity;<br />import android.os.AsyncTask;<br />import android.os.Bundle;<br />import android.view.View;<br />import android.view.View.OnClickListener;<br />import android.widget.Button;<br />import android.widget.EditText;<br />import android.widget.TextView; </p><p>public class Main extends Activity implements OnClickListener<br />{<br /> private EditText etProductName;<br /> private TextView tvResult; </p><p> class WSAsyncTask extends AsyncTask<br /> {<br /> String result = "";<br /> @Override<br /> protected Object doInBackground(Object... params)<br /> {<br /> try<br /> {<br /> String serviceUrl = "http://192.168.17.156:8080/axis2/services/SearchProductService?wsdl";<br /> String methodName = "getProduct";<br /> SoapObject request = new SoapObject("http://service",<br /> methodName);<br /> request.addProperty("productName", etProductName.getText().toString());<br /> SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(<br /> SoapEnvelope.VER11);<br /> envelope.bodyOut = request;<br /> HttpTransportSE ht = new HttpTransportSE(serviceUrl); </p><p> ht.call(null, envelope);<br /> if (envelope.getResponse() != null)<br /> {<br /> SoapObject soapObject = (SoapObject) envelope.getResponse();<br /> result = "產品名稱:" + soapObject.getProperty("name") + "/n";<br /> result += "產品數量:" + soapObject.getProperty("productNumber")<br /> + "/n";<br /> result += "產品價格:" + soapObject.getProperty("price"); </p><p> }<br /> else<br /> {<br /> result = "無此產品.";<br /> }<br /> }<br /> catch (Exception e)<br /> {<br /> result = "調用WebService錯誤.";<br /> }<br /> // 必須使用post方法更新UI組件<br /> tvResult.post(new Runnable()<br /> {<br /> @Override<br /> public void run()<br /> {<br /> tvResult.setText(result); </p><p> }<br /> });<br /> return null;<br /> } </p><p> }<br /> @Override<br /> public void onClick(View view)<br />{<br /> // 非同步執行調用WebService的任務<br /> new WSAsyncTask().execute();<br /> }<br /> @Override<br /> public void onCreate(Bundle savedInstanceState)<br /> {<br /> super.onCreate(savedInstanceState);<br /> setContentView(R.layout.main);<br /> Button btnSearch = (Button) findViewById(R.id.btnSearch);<br /> btnSearch.setOnClickListener(this);<br /> etProductName = (EditText) findViewById(R.id.etProductName);<br /> tvResult = (TextView) findViewById(R.id.tvResult); </p><p> }<br />}

 

 

1. 一般需要編寫一個AsyncTask的子類來完成後台執行任務的工作。2.  AsyncTask的核心方法是doInBackground,當調用AsyncTask類的execute方法時,doInBackground方法會非同步執行。因此,可以將執行任務的代碼寫在doInBackground方法中。3. 由於本例中的TextView組件是在主線程(UI線程)中建立的,因此,在其他的線程(doInBackground方法所在的線程)中不能直接更新TextVew組件。為了更新TextView組件,需要使用TextView類的post方法。該方法的參數是一個Runnable對象,需要將更新TextView組件的代碼寫在Runnable介面的run方法中。4. 雖然不能在其他線程中更新UI組件,但可以從其他線程直接讀取UI組件的值。例如,在doInBackground方法中直接讀取了EditText組件的值。5. 調用AsyncTask類的execute方法後會立即返回。execute方法的參數就是doInBackground方法的參數。doInBackground方法的傳回值可以通過AsyncTask.execute(...).get()方法獲得。讀者可以將本例中的IP改成其他的值,看看單擊按鈕後,是否還可在文字框中輸入其他的內容。如果這個IP是正確的,並且WebService可訪問,那麼會在TextView組件中輸出相應的傳回值。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.