非同步android
『壹』 android 非同步載入有幾種方法
子線程沒有控制並發數量,當並發過多的時候非同步方法的作用就體現出來了。
非同步是相對於同步而言的,顧名思義,同步就是各個通訊節點之間有統一的時鍾,按照相同的時鍾工作,非同步相反,各節點之間沒有統一的時鍾,每個節點按照自己內部的時鍾工作。
android在所有Thread當中,有一個Thread,我們稱之為UI Thread。UI
Thread在Android程序運行的時候就被創建,是一個Process當中的主線程Main
Thread,主要是負責控制UI界面的顯示、更新和控制項交互。在Android程序創建之初,一個Process呈現的是單線程模型,所有的任務都在一個線程中運行。因此,我們認為,UI
Thread所執行的每一個函數,所花費的時間都應該是越短越好。而其他比較費時的工作(訪問網路,下載數據,查詢資料庫等),都應該交由子線程去執行,以免阻塞主線程。
『貳』 android什麼叫非同步請求,怎麼實現
一.非同步請求主要解決線程無法更新UI組件的方案
使用Handler實現線程之間的通信。
Activity.runOnUiThread(Runnbale)
View.post(Runnable)
View.postDelayed(Runnable)
二.ANR異常
Android默認約定當UI線程阻塞超過20秒將會引發ANR異常。開發者必須牢記,不要在UI線程中執行一些耗時操作
三.AsyncTask抽象類
AsyncTask<Params,Progress,Result>是一個抽象類,通常用於被繼承,繼承AsyncTask需要指定三個泛型參數:
Params:啟動任務執行的輸入參數的類型
Progress:後台任務完成進度值得類型
Result:後台執行任務完成後返回結果的類型
四.AsyncTask的特點
更輕量一些,適用於簡單的非同步處理,不需要藉助線程和Handler即可
五.使用AsyncTask的步驟
創建AsyncTask的子類,並為三個泛型參數指定類型,如果某個泛型參數不需要指定類型,可將它設為Void
根據需要,實現AsyncTask的如下方法:
doInBackground(Params...):後台線程將要完成的任務,可以調用publishProgress(Porgress...values)方法更新任務執行進度。
onProgressUpdate(Porgress..values):在doInBackground()方法中調用publishPorgress()方法更新任務的執行進度後,就會觸發該方法
onPreExecute():執行後台耗時操作前被調用,通常用戶完成一些初始化操作,比如在界面上顯示進度條
onPostExecute(Result result):當doInBackground()完成後,系統會自動調用onPostExecute()方法,並將doInBackground()方法返回的值傳給該方法.
調用AsyncTask子類的實例的execute(Params...params)開始執行耗時任務
六.使用AsyncTask時必須遵守的規則
必須在UI中創建AsyncTask的實例
必須在UI線程中調用AsyncTask的execute()方法
AsyncTask的onPreExecute()、onPostExecute(Result result)、doInBackground(Params....params)、onProgressUpdate(Progress...values)方法,不應該由程序員代碼調用,而是由AsyncTask系統負責調用
每個AsyncTask只能被執行一次,多次調用將會引發異常。
『叄』 android sdk哪些非同步方法
android中有下列幾種非同步更新ui的解決辦法:
Activity.runOnUiThread(Runnable) View.post(Runnable) long) View.postDelayed(Runnable, long) 使用handler(線程間通訊)(推薦) AsyncTask(推薦)
對於下面這段代碼:
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
Bitmap bitmap = loadImageFromNetwork("http://example.com/image.png");
mImageView.setImageBitmap(bitmap);
}
}).start();
}
『肆』 android非同步網路載入怎麼實現
AndroidManifest.xml
01 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
02 package="com.doodle.asycntasksample"
03 android:versionCode="1"
04 android:versionName="1.0" >
05
06 <uses-sdk
07 android:minSdkVersion="8"
08 android:targetSdkVersion="15" />
09
10 <uses-permission android:name="android.permission.INTERNET" />
11
12 <application
13 android:icon="@drawable/ic_launcher"
14 android:label="@string/app_name"
15 android:theme="@style/AppTheme" >
16 <activity
17 android:name="com.doodle.asynctasksample.ThreadHandlerPostActivity" >
18 </activity>
19 <activity android:name="com.doodle.asynctasksample.AsyncTastActivity" >
20 </activity>
21 <activity android:name="com.doodle.asynctasksample.ThreadHandlerActivity" >
22 </activity>
23 <activity
24 android:name="com.doodle.asynctasksample.BootActivity"
25 android:label="@string/title_activity_boot" >
26 <intent-filter>
27 <action android:name="android.intent.action.MAIN" />
28 <category android:name="android.intent.category.LAUNCHER" />
29 </intent-filter>
30 </activity>
31 </application>
32
33 </manifest>
list_item.xml
01 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
02 xmlns:tools="http://schemas.android.com/tools"
03 android:layout_width="match_parent"
04 android:layout_height="match_parent" >
05
06 <LinearLayout
07 android:layout_width="match_parent"
08 android:layout_height="150dp"
09 android:layout_alignParentLeft="true"
10 android:layout_alignParentRight="true"
11 android:layout_alignParentTop="true" >
12
13 <ImageView
14 android:id="@+id/imageView"
15 android:layout_width="match_parent"
16 android:layout_height="match_parent"
17 android:src="<a href="http://my.oschina.net/asia" target="_blank"rel="nofollow">@android</a> :drawable/alert_dark_frame" />
18
19 </LinearLayout>
20
21 </RelativeLayout>
ImageAdapter.java
01 /**
02 * Create a customized data structure for each item of ListView.
03 * An ImageAdapter inherited from BaseAdapter must overwrites
04 * getView method to show every image in specified style.In this
05 * instance only a ImageView will put and fill in each item of
06 * ListView.
07 *
08 * @author Jie.Geng Aug 01, 2012.
09 *
10 */
11 public class ImageAdapter extends BaseAdapter {
12 private Context context;
13 private List<HashMap<String, Object>> listItems;
14 private LayoutInflater listContainer;
15
16 public ImageView imageView;
17
18 public ImageAdapter(Context context, List<HashMap<String, Object>> listItems) {
19 super();
20 this.context = context;
21 this.listContainer = LayoutInflater.from(context);
22 this.listItems = listItems;
23 }
24
25 @Override
26 public int getCount() {
27 return listItems.size();
28 }
29
30 @Override
31 public Object getItem(int position) {
32 return null;
33 }
34
35 @Override
36 public long getItemId(int position) {
37 return 0;
38 }
39
40 @Override
41 public View getView(int position, View convertView, ViewGroup parent) {
42 if(convertView == null) {
43 convertView = listContainer.inflate(R.layout.list_item, null);
44 imageView = (ImageView) convertView.findViewById(R.id.imageView);
45 convertView.setTag(imageView);
46 } else {
47 imageView = (ImageView) convertView.getTag();
48 }
49 imageView.setImageDrawable((Drawable) listItems.get(position).get("ItemImage"));
50 return convertView;
51 }
一、採用AsyncTask
AsyncTask簡介 AsyncTask的特點是任務在主線程之外運行,而回調方法是在主線程中執行,這就有效地避免了使用Handler帶來的麻煩。閱讀 AsyncTask的源碼可知,AsyncTask是使用java.util.concurrent 框架來管理線程以及任務的執行的,concurrent框架是一個非常 成熟,高效的框架,經過了嚴格的測試。這說明AsyncTask的設計很好的解決了匿名線程存在的問題。 AsyncTask是抽象類,其結構圖如下圖所示: AsyncTask定義了三種泛型類型 Params,Progress和Result。 Params 啟動任務執行的輸入參數,比如HTTP請求的URL。 Progress 後台任務執行的百分比。 Result 後台執行任務最終返回的結果,比如String。 子類必須實現抽象方法doInBackground(Params… p) ,在此方法中實現任務的執行工作,比如連接網路獲取數據等。通常還應 該實現onPostExecute(Result r)方法,因為應用程序關心的結果在此方法中返回。需要注意的是AsyncTask一定要在主線程中創 建實例。 AsyncTask的執行分為四個步驟,每一步都對應一個回調方法,需要注意的是這些方法不應該由應用程序調用,開發者需要做的 就是實現這些方法。在任務的執行過程中,這些方法被自動調用,運行過程,如下圖所示: onPreExecute() 當任務執行之前開始調用此方法,可以在這里顯示進度對話框。 doInBackground(Params…) 此方法在後台線程執行,完成任務的主要工作,通常需要較長的時間。在執行過程中可以調用 publicProgress(Progress…)來更新任務的進度。 onProgressUpdate(Progress…) 此方法在主線程執行,用於顯示任務執行的進度。 onPostExecute(Result) 此方法在主線程執行,任務執行的結果作為此方法的參數返回There are a few threading rules that must be followed for this class to work properly: The AsyncTask class must be loaded on the UI thread. This is done automatically as of JELLY_BEAN. The task instance must be created on the UI thread. execute(Params...) must be invoked on the UI thread. Do not call onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...) manually. The task can be executed only once (an exception will be thrown if a second execution is attempted.)AsyncTastActivity.java
01 public class AsyncTastActivity extends Activity {
02
03 private List<String> urlList;
04 private ImageAdapter listItemAdapter;
05 private ArrayList<HashMap<String, Object>> listItem;
06
07 @Override
08 public void onCreate(Bundle savedInstanceState) {
09 super.onCreate(savedInstanceState);
10 setContentView(R.layout.activity_main);
11 urlList = new ArrayList<String>();
12 urlList.add("http://www..com/img/_sylogo1.gif");
13 urlList.add("http://y2.ifengimg.com/2012/06/24/23063562.gif");
14 urlList.add("http://himg2.huanqiu.com/statics/images/index/logo.png");
15
16 listItem = new ArrayList<HashMap<String, Object>>();
17
18 listItemAdapter = new ImageAdapter(this, listItem);
19 ListView listView = (ListView) this.findViewById(R.id.listView1);
20 listView.setAdapter(listItemAdapter);
21
22 AsyncTask<List<String>, Integer, Hashtable<String, SoftReference<Drawable>>> task = newAsyncTask<List<String>, Integer, Hashtable<String, SoftReference<Drawable>>>() {
23
24 @Override
25 protected void onPreExecute() {
26 super.onPreExecute();
27 }
28
29 @Override
30 protected Hashtable<String, SoftReference<Drawable>> doInBackground(
31 List<String>... params) {
32 Hashtable<String, SoftReference<Drawable>> table = new Hashtable<String, SoftReference<Drawable>>();
33 List<String> imageUriList = params[0];
34 for (String urlStr : imageUriList) {
35 try {
36 URL url = new URL(urlStr);
37 Drawable drawable = Drawable.createFromStream(
38 url.openStream(), "src");
39 table.put(urlStr, new SoftReference<Drawable>(drawable));
40 } catch (Exception e) {
41 e.printStackTrace();
42 }
43 }
44 return table;
45 }
46
47 @Override
48 protected void onPostExecute(
49 Hashtable<String, SoftReference<Drawable>> result) {
50 super.onPostExecute(result);
51 Collection<SoftReference<Drawable>> col = result.values();
52 for (SoftReference<Drawable> ref : col) {
53 HashMap<String, Object> map = new HashMap<String, Object>();
54 map.put("ItemImage", ref.get());
55 listItem.add(map);
56 }
57 listItemAdapter.notifyDataSetChanged();
58
59 }
60 };
61
62 task.execute(urlList);
63 }
64
65 @Override
66 public boolean onCreateOptionsMenu(Menu menu) {
67 getMenuInflater().inflate(R.menu.activity_main, menu);
68 return true;
69 }
70 }
二、採用Thread + Handler + Message
Handler簡介 Handler為Android提供了一種非同步消息處理機制,它包含兩個隊列,一個是線程列隊,另一個是消息列隊。使用post方法將線 程對象添加到線程隊列中,使用sendMessage(Message message)將消息放入消息隊列中。當向消息隊列中發送消息後就立 即返回,而從消息隊列中讀取消息對象時會阻塞,繼而回調Handler中public void handleMessage(Message msg)方法。因此 在創建Handler時應該使用匿名內部類重寫該方法。如果想要這個流程一直執行的話,可以再run方法內部執行postDelay或者 post方法,再將該線程對象添加到消息隊列中重復執行。想要停止線程,調用Handler對象的removeCallbacks(Runnable r)從 線程隊列中移除線程對象,使線程停止執行。
『伍』 android中實現非同步操作的方式有哪些,請簡述各自的特點
AsyncTask類。這是安卓自帶的非同步載入類,封裝較好,使用方便
直接開啟子線程通過handler發送消息更新,代碼繁瑣一點,AsyncTask源碼也是這個原理
『陸』 android什麼樣的消息屬於非同步消息
非同步消息和線程的區別在於,線程執行完run()方法後,線程就結束了,而非同步消息是在線程內部有一個消息隊列,寫一個死循環,
一直去消息隊列里去取消息,然後根據消息類型處理相應的操作,如果取不到消息就一直在等待。
非同步認為一般用於:任務需要常駐,比如處理用戶交互的屏幕觸摸事件處理;根據不同的消息類型處理不同的操作。
實現上就是:
1.每個非同步任務要有一個消息隊列;
2使用while(true)無限循環,讀取消息,處理消息,執行回調函數等;
3,外部可以向隊列發消息,消息隊列注意線程安全。
『柒』 android為什麼要用非同步任務
一般Android中的非同步都是用在網路請求時,而網路請求都有一些延時,如果都放在主線程中就會出現屏幕卡住的現象,這樣會影響用戶操作效果。。。
『捌』 Android非同步是什麼意思
非同步就是不同Android設備之間信息不完全一致,比如說你在一台手機上更新了通訊錄,同步就是這個新的通訊錄信息在你所有設備上同步更新,非同步就是只有這一台設備的通訊錄更新,其他設備信息不會變動