編輯:關於Android編程
接上文
MainActivity的onCreate方法中如果沒有有這段代碼:
// 強制在UI線程中操作 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWrites().detectNetwork() .penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath() .build());
會報錯誤如下:
FATAL EXCEPTION:main
java.lang.NullPointerException
atcom.example.demoservice.MainActivity.getRemoteInfo(MainActivity.java:91)
atcom.example.demoservice.MainActivity$1.onClick(MainActivity.java:51)
這是因為android 3.0+以上 已經不建議在activity中添加耗時操作,要界面和數據脫離。4.0以上的通信都必須放到線程裡去做,不能在UI線程。解決辦法是另起線程,如果一定要想在UI線程操作,就需要添加如上代碼。
顯然這樣做是不可取的,因為通信消耗時間長,可能會讓用戶傻傻的等待,那麼接下來就通過引入線程來解決這個問題。
我們可以用Runnable接口和Thread類創建線程,從而捨棄強制使用UI主線程的方式,代碼如下(同時對代碼進行了整理,把nameSpace等變量抽出來)
public classMainActivity 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
通過線程進行通信,得到同樣結果
可以發現,執行線程中需要在線程中返回一個值,通過在run()中保存返回值,存儲返回值的變量應該是MainActivity的成員變量,然後在主線程中用一個get方法取得該值。
但是run何時完成是未知的,很可能當第一次點擊按鈕後,依然看不到結果,直到第二次或者更多才看到,所以我們需要一定的機制來保證。
而在Java se5就開始用Callable和Future來管理多線程了,可以解決這個問題,接下文。。。
浏覽器是否能哆無縫地渲染播放器的輸出,取決於播放器是否有良好的設計。一個有良好設計的播放器要有獨立的輸入和輸出。輸入就是一個URL或者一個本地文件路徑,輸出即為一幀一幀的
android 中使用Canvas的drawText繪制文本的位置,是基於基線的。如下圖: 其中字母Q的小尾巴在橫線下面了。 這裡面的關鍵是Paint.getT
說來慚愧,MVP的架構模式已經在Android領域出現一兩年了,但是到今天自己才開始Android領域中的MVP架構征程。閒話不多說,開始吧!一、架構演變概述我記得我找
使用實現了單選功能的ListView,不要問為什麼不使用RecyclerView,RecyclerView真的做得不如ListView和GridView完善全面,但是Re