總結(jié)Android中多線程更新應(yīng)用的頁(yè)面信息的方式
一、runOnUiThread的用法
runOnUiThread是Activity的內(nèi)部方法,使用時(shí)最好指定當(dāng)前的環(huán)境變量(Context)。
new Thread(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(mainActivity.this,"UI操作。。。",0).show();
}
});
}
}).start();
執(zhí)行runOnUiThread這個(gè)方法會(huì)調(diào)用父類中的
public final void runOnUiThread(Runnable action){
if(Thread.currentThread()!=mUiThread){
mHandler.post(action);
}else{
action.run();
}
}
二、新線程中View直接在UI線程中更新的方法
textView.postDelayed(new Runnable() {
@Override
public void run() {
textView.setText("Test View.post(Runnable)");
}
}, 1000);
-
textView.post(new Runnable() {
@Override
public void run() {
textView.setText("Test View.postDelay(Runnable,long)");
}
});
三、Handler(消息傳遞機(jī)制)使用
Handler myHandler = new Handler(){
public void handleMessage(Message msg){
super.handleMessage(msg);
}
};
也可以繼承handler
class MyHandler extends handler{
public MyHandler(){
}
@Override
public void handleMessage(Message msg){
super.handleMessage(msg);
}
}
分發(fā)Message或者Runnable對(duì)象到handler所在的線程中一般handler在主線程中。
handler中一些分發(fā)消息的方法:
- post(Runnable)
- postAtTime(Runnable,long)
- postDelay(Runnable,long)
- sendEmptyMessage(int what)
- sendMessage(Message)
- senMessageAtTime(Message,long)
- sendMessageDelayed(Message,long)
post方式添加一個(gè)實(shí)現(xiàn)Runnable接口的匿名對(duì)象到消息對(duì)列中,在目標(biāo)收到消息后就可以以回調(diào)的方式在自己的線程中執(zhí)行
Message對(duì)象所具有的屬性:
| 屬性 | 類型 | 描述 |
|---|---|---|
| arg1 | int | 用來(lái)存放整型數(shù)據(jù) |
| arg2 | int | 用來(lái)存放整型數(shù)據(jù) |
| obj | Object | 用來(lái)存放發(fā)送給接收器的Object任意對(duì)象 |
| replyTo | Messager | 用來(lái)指定此Message發(fā)送到何處的可選Message對(duì)象 |
| what | int | 用于指定用戶自定義的消息代碼這樣接受者就可以了解這個(gè)消息的信息 |
Message message = Message.obtain(); message.arg1 = 1; message.arg2 = 2; message.obj = "Demo"; message.what = 3; Bundle bundle = new Bundle(); bundle.putString( "name","Lucy"); message.setData(bundle);
下面貼上一段示例代碼(開(kāi)啟新線程實(shí)現(xiàn)電子廣告牌)
public class MainActivity extends Activity implements Runnable {
private ImageView iv;
private TextView tv;
private Handler handler;
private int[] path = new int[]{R.drawable.img01,R.drawable.img02,R.drawable.img03,R.drawable.img04,
R.drawable.img05,R.drawable.img06};
private String[] title = new String[]{"編程詞典系列","高效開(kāi)發(fā)","快樂(lè)分享","用戶人群","快速學(xué)習(xí)","全方位查詢"};
private int index =0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.imageView1);
tv = (TextView) findViewById(R.id.textView1);
Thread t = new Thread(this);
t.start();
handler = new Handler(){
public void handleMessage(Message msg){
if (msg.what ==1) {
tv.setText(msg.getData().getString("title"));
iv.setImageResource(path[msg.arg1]);
}
super.handleMessage(msg);
}
};
}
@Override
public void run() {
while(!Thread.currentThread().isInterrupted()){
index = new Random().nextInt(path.length);
Message m = handler.obtainMessage();
m.arg1 = index;
Bundle bundle = new Bundle();
m.what = 1;
bundle.putString("title", title[index]);
m.setData(bundle);
handler.sendMessage(m);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
四、AsyncTask異步任務(wù)的用法
- AsyncTask實(shí)際上是一個(gè)線程池,在代碼上比handler要輕量級(jí)但是實(shí)際上要比Handler要耗資源,Handler僅僅發(fā)送了一個(gè)消息隊(duì)列,連線程池對(duì)沒(méi)有開(kāi)。
- onPreExecute(),(可選方法)最新用戶調(diào)用excute時(shí)的接口,任務(wù)執(zhí)行之前調(diào)用該方法,可以在這里顯示進(jìn)度對(duì)話框。
- doInBackground(Params...),后臺(tái)執(zhí)行比較好使的操作,不能直接操縱UI。在該方法中使用publishProgress(progress...)來(lái)更新任務(wù)的進(jìn)度。
- onProgressUpdate(Progress...),在主線程中執(zhí)行,顯示進(jìn)度條
- onPostExecute(Result),此方法可以從doinbackground得到的結(jié)果來(lái)操作UI,在主線程中執(zhí)行,執(zhí)行的結(jié)果作為參數(shù)返回。
- onCancelled(Object)調(diào)用此方法可以隨時(shí)取消操作。
AsyncTask定義的三種泛型
- params: 啟動(dòng)任務(wù)執(zhí)行的輸入?yún)?shù),如:http請(qǐng)求的URL
- progress:后臺(tái)任務(wù)執(zhí)行的百分比
- result:返回結(jié)果,如:String、list集合等
private class MyTask extends AsyncTask<params, progress, result> { ... }
示例代碼:
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
獲取網(wǎng)絡(luò)圖片的示例代碼:
public class MainActivity extends ActionBarActivity {
private ImageView iv;
private Button bt;
private String imagePath = "http://192.168.1.1/sa";
private ProgressDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.imageView1);
bt = (Button) findViewById(R.id.button1);
dialog = new ProgressDialog(this);
dialog.setTitle("提示信息:");
dialog.setMessage("正在下載。。。");
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new MyTask().execute(imagePath);
}
});
}
public class MyTask extends AsyncTask<String, Void, Bitmap>{
@Override
protected Bitmap doInBackground(String... params) {
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(params[0]);
Bitmap bitmap = null;
try {
HttpResponse httpResponse = httpClient.execute(httpGet);
if (httpResponse.getStatusLine().getStatusCode()==200) {
HttpEntity httpEntity = httpResponse.getEntity();
byte[] data = EntityUtils.toByteArray(httpEntity);
bitmap= BitmapFactory.decodeByteArray(data, 0, data.length);
}
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog.show();
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
iv.setImageBitmap(result);
dialog.dismiss();
}
}
}
- Android應(yīng)用強(qiáng)制更新APP的示例代碼
- Android應(yīng)用APP自動(dòng)更新功能的代碼實(shí)現(xiàn)
- 非常實(shí)用的小功能 Android應(yīng)用版本的更新實(shí)例
- 安卓(Android)應(yīng)用版本更新方法
- Android應(yīng)用自動(dòng)更新功能實(shí)現(xiàn)的方法
- Android App實(shí)現(xiàn)應(yīng)用內(nèi)部自動(dòng)更新的最基本方法示例
- Android編程實(shí)現(xiàn)應(yīng)用自動(dòng)更新、下載、安裝的方法
- Android應(yīng)用程序更新并下載實(shí)例
相關(guān)文章
Android 開(kāi)機(jī)應(yīng)用掃描相關(guān)總結(jié)
本篇文章只是作為指南引導(dǎo)去看PkMS,不會(huì)貼大段代碼進(jìn)行分析,更多是基于方法分析實(shí)現(xiàn)的邏輯,另外就是代碼是基于Android 11,與Android 10之前代碼有比較大的差別。2021-05-05
Android編程實(shí)現(xiàn)檢測(cè)當(dāng)前電源狀態(tài)的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)檢測(cè)當(dāng)前電源狀態(tài)的方法,涉及Android針對(duì)當(dāng)前電源的電量、容量、伏數(shù)、溫度等的檢測(cè)技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-11-11
ListView實(shí)現(xiàn)下拉刷新加載更多的實(shí)例代碼(直接拿來(lái)用)
這篇文章主要介紹了ListView實(shí)現(xiàn)下拉刷新加載更多的實(shí)例代碼(直接拿來(lái)用)的相關(guān)資料,需要的朋友可以參考下2016-07-07
Android APK優(yōu)化工具Zipalign詳解
本文主要介紹Android APK優(yōu)化工具Zipalign,這里整理了相關(guān)資料,并詳細(xì)介紹如何使用Zipalign工具及使用技巧,有需要的小伙伴可以參考下2016-09-09
Android中SurfaceView和view畫出觸摸軌跡
這篇文章主要介紹了Android中SurfaceView和view畫出觸摸軌跡的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-03-03
Android Studio打包.so庫(kù)到apk中實(shí)例詳解
這篇文章主要介紹了Android Studio打包.so庫(kù)到apk中實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04
Android異步回調(diào)中的UI同步性問(wèn)題分析
這篇文章主要為大家詳細(xì)分析了Android異步回調(diào)中的UI同步性問(wèn)題,感興趣的小伙伴們可以參考一下2016-06-06

