標籤:android c style class blog code
參考:http://blog.csdn.net/x86android/article/details/14161981
http://geeksun.iteye.com/blog/1447708
Android中的線程
在Android平台中多線程應用很廣泛,在UI更新、遊戲開發和耗時處理(網路通訊等)等方面都需要多線程。Android線程涉及的技術有:Handler;Message;MessageQueue;Looper;HandlerThread。
有一點要非常注意的,就是在寫這個多線程代碼的時候,遇到了兩個錯誤:第一個是
android.os.NetworkOnMainThreadException異常;第二個是Only the original thread that created a view hierarchy can touch its views異常。
出現android.os.NetworkOnMainThreadException異常的原因是,在4.0以上Android中,訪問網路不能在主線程中,否則會報錯。出現第二個Only the original thread that created a view hierarchy can touch its views異常的原因是,Android中更新UI處理必須由建立它的線程更新,而不能在其他線程中更新,處理方法是通過message和handler的機制來重新整理主線程UI。
正確代碼如下:
package com.example.MyStarRss;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.widget.Button;import android.widget.TextView;public class MyStarRssActivity extends Activity { /** * Called when the activity is first created. */ private TextView showTextView; private String data = ""; private Handler handler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button startDownload_button = (Button)findViewById(R.id.start_download); showTextView = (TextView)findViewById(R.id.showdata_textview); startDownload_button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 啟動下載任務 new Thread(downtask).start(); } }); handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch(msg.what){ case 0: showTextView.setText(msg.obj.toString()); } } }; } Runnable downtask = new Runnable() { @Override public void run() { MyHttpDownLoader myHttpDownLoader = new MyHttpDownLoader("http://rss.sina.com.cn/ent/hot_roll.xml"); String mydata = myHttpDownLoader.starDownload_Text(); Message msg = new Message(); msg.obj = mydata; msg.what = 0; handler.sendMessage(msg); } };}
通過代碼可以看出,啟動多線程後,子線程要通過message和handler來與主線程進行通訊。子線程啟動之後,在完成下載任務時會向handler發送一個message, 通知主線程下載已經完成,然後通過主線程來更新UI。