編輯:關於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
ArrayList params= new ArrayList();
ArrayList
通過線程進行通信,得到同樣結果

可以發現,執行線程中需要在線程中返回一個值,通過在run()中保存返回值,存儲返回值的變量應該是MainActivity的成員變量,然後在主線程中用一個get方法取得該值。
但是run何時完成是未知的,很可能當第一次點擊按鈕後,依然看不到結果,直到第二次或者更多才看到,所以我們需要一定的機制來保證。
而在Java se5就開始用Callable和Future來管理多線程了,可以解決這個問題,接下文。。。
Chromium為視頻標簽(video)渲染視頻畫面的過程分析
浏覽器是否能哆無縫地渲染播放器的輸出,取決於播放器是否有良好的設計。一個有良好設計的播放器要有獨立的輸入和輸出。輸入就是一個URL或者一個本地文件路徑,輸出即為一幀一幀的
android精確繪制文字位置的方法
android 中使用Canvas的drawText繪制文本的位置,是基於基線的。如下圖: 其中字母Q的小尾巴在橫線下面了。 這裡面的關鍵是Paint.getT
Android中的MVP架構解密
說來慚愧,MVP的架構模式已經在Android領域出現一兩年了,但是到今天自己才開始Android領域中的MVP架構征程。閒話不多說,開始吧!一、架構演變概述我記得我找
ListView加Fragment實現Flyme4.0設置界面
使用實現了單選功能的ListView,不要問為什麼不使用RecyclerView,RecyclerView真的做得不如ListView和GridView完善全面,但是Re