編輯:關於Android編程
接上文
對於Java多線程的理解,我以前僅僅局限於實現Runnable接口或者繼承Thread類,然後重寫run()方法,最後start()調用就算完事,但是一旦涉及死鎖以及對共享資源的訪問和隨時監控線程的狀態和執行順序和線程返回值等就不行了。
Callable接口代表一段可以調用並返回結果的代碼;Future接口表示是執行異步任務時的狀態、返回值等信息。所以說Callable用於產生結果,Future用於獲取結果。
1. Callable
Callable 是一個接口,它只包含一個call()方法。Callable是一個返回結果並且可能拋出異常的任務。
為了便於理解,我們可以將Callable比作一個Runnable接口,而Callable的call()方法則類似於Runnable的run()方法。
Callable的源碼如下:
publi cinterface Callable{ V call() throws Exception; }
2. Future
Future 是一個接口。它用於表示異步計算的結果。提供了檢查計算是否完成的方法,以等待計算的完成,並獲取計算的結果。
Future的源碼如下:
public interface Future{ // 試圖取消對此任務的執行。 boolean cancel(boolean mayInterruptIfRunning) //如果在任務正常完成前將其取消,則返回 true。 boolean isCancelled() //如果任務已完成,則返回 true。 boolean isDone() //如有必要,等待計算完成,然後獲取其結果。 V get() throws InterruptedException,ExecutionException; //如有必要,最多等待為使計算完成所給定的時間之後,獲取其結果(如果結果可用)。 V get(long timeout, TimeUnitunit) throws InterruptedException,ExecutionException, TimeoutException; }
我們先通過一個示例看看Callable和Future的基本用法
importjava.util.concurrent.Callable; importjava.util.concurrent.Future; importjava.util.concurrent.Executors; importjava.util.concurrent.ExecutorService; importjava.util.concurrent.ExecutionException; classMyCallable implements Callable { @Override public Integer call() throws Exception { int sum = 0; // 執行任務 for (int i=0; i<100; i++) sum += i; //return sum; return Integer.valueOf(sum); } } publicclass CallableTest1 { public static void main(String[] args) throws ExecutionException,InterruptedException{ //創建一個線程池 ExecutorService pool =Executors.newSingleThreadExecutor(); //創建有返回值的任務 Callable c1 = new MyCallable(); //執行任務並獲取Future對象 Future f1 = pool.submit(c1); // 輸出結果 System.out.println(f1.get()); //關閉線程池 pool.shutdown(); } }
運行結果:
4950
結果說明:
在主線程main中,通過newSingleThreadExecutor()新建一個線程池。接著創建Callable對象c1,然後再通過pool.submit(c1)將c1提交到線程池中進行處理,並且將返回的結果保存到Future對象f1中。然後,我們通過f1.get()獲取Callable中保存的結果;最後通過pool.shutdown()關閉線程池。
其實通過上面的簡單例子,完全可以將通過Runnable接口或者Thread類實現的線程代碼,修改成Callable和Future實現的線程。
public class Main Activity extends Activity { public static final String TAG ="webService_pj"; private EditText phoneSecEditText; private TextView resultView; private Button queryButton; @Override public void onCreate(BundlesavedInstanceState) { // StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder() // .detectDiskReads().detectDiskWrites().detectNetwork() // .penaltyLog().build()); // // StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder() // .detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath() // .build()); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); phoneSecEditText = (EditText)findViewById(R.id.phone_sec); resultView = (TextView)findViewById(R.id.result_text); queryButton = (Button)findViewById(R.id.query_btn); queryButton.setOnClickListener(newOnClickListener() { @Override public void onClick(View v) { Log.i(TAG,"MainActivity線程ID:"+Thread.currentThread().getId()); // 手機號碼(段) String phoneSec =phoneSecEditText.getText().toString().trim(); // 簡單判斷用戶輸入的手機號碼(段)是否合法 if("".equals(phoneSec) || phoneSec.length() < 7) { // 給出錯誤提示 phoneSecEditText.setError("您輸入的手機號碼(段)有誤!"); phoneSecEditText.requestFocus(); // 將顯示查詢結果的TextView清空 resultView.setText(""); return; } // 命名空間 String nameSpace = "http://WebXml.com.cn/"; // 調用的方法名稱 String methodName ="getMobileCodeInfo"; // EndPoint String endPoint = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx"; // SOAP Action String soapAction = "http://WebXml.com.cn/getMobileCodeInfo"; // method params and values ArrayListparams= new ArrayList (); ArrayList
至此,Android調用Webservice就完美的完成了。
http://download.csdn.net/detail/tcl_6666/7365341
本菜開源的一個自己寫的Demo,希望能給Androider們有所幫助,水平有限,見諒見諒… https://github.com/zhiaixinyang
概述Android Settings模塊說簡單也簡單,說難也難,裡面涉及到的知識點也挺多的。我們知道Settings主要是用於配置一些系統選項或屬性值,通過修改設置項就能
前言 這段時間在Testerhome上看了一些有關性能測試的帖子,看別人的東西,始終是別人的,只有自己寫一遍才能體會其中的細節,雖然說不要重復造輪子,但是這種基礎的東西
如果你想在你的Android程序中自動打印MainActivity.onCreate(line:37)這種類名.方法名(行數)的日志該如何實現呢? 1.引入Java的線程