Only the original thread that created a view hierarchy can touch its views!
出现这个问题的原因是:
原来android中相关的view和控件不是线程安全的,我们必须单独做处理。
所以建议大家用handler来处理这个问题。
Handler:
Handler的官方描述:
A Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue. Each Handler instance is associated with a single thread and that thread's message queue. When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it -- from that point on, it will deliver messages and runnables to that message queue and execute them as they come out of the message queue
.Handler的使用场合:
1、 to schedule messages and runnables to be executed as some point in the future;
安排messages和runnables在将来的某个时间点执行。
2、 to enqueue an action to be performed on a different thread than your own.
将action入队以备在一个不同的线程中执行。即可以实现线程间通信。比如当你创建子线程时,你可以再你的子线程中拿到父线程中创建的Handler对象,就可以通过该对象向父线程的消息队列发送消息了。由于Android要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面。
通过Handler更新UI实例:
步骤:
1、创建Handler对象(此处创建于主线程中便于更新UI)。
2、构建Runnable对象,在Runnable中更新界面。
3、在子线程的run方法中向UI线程post,runnable对象来更新UI。

详细代码如下:
package djx.android;

import djx.downLoad.DownFiles;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class downLoadPractice extends Activity {
private Button button_submit=null;
private TextView textView=null;
private String content=null;
private Handler handler=null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//创建属于主线程的handler
handler=new Handler();

button_submit=(Button)findViewById(R.id.button_submit);
textView=(TextView)findViewById(R.id.textView);
button_submit.setOnClickListener(new submitOnClieckListener());
}
//为按钮添加监听器
class submitOnClieckListener implements OnClickListener{
@Override
public void onClick(View v) {
//本地机器部署为服务器,从本地下载a.txt文件内容在textView上显示
final DownFiles df=new DownFiles("http://192.168.75.1:8080/downLoadServer/a.txt");
textView.setText("正在加载......");
new Thread(){
public void run(){
content=df.downLoadFiles();
handler.post(runnableUi);
}
}.start();
}

}

// 构建Runnable对象,在runnable中更新界面
Runnable runnableUi=new Runnable(){
@Override
public void run() {
//更新界面
textView.setText("the Content is:"+content);
}

};


}

更多相关文章

  1. Intent跳转到系统应用中的拨号界面、联系人界面、短信界面及其他
  2. 学习Android界面设计的超级利器HierarchyView
  3. Android 如何更换屏幕上锁界面背景图片
  4. Android的进程与线程模型
  5. android消息机制,异步和多线程
  6. Android编程 获取网络连接状态 及调用网络配置界面
  7. Android中的线程之线程基础(synchronized,wait,sleep,yield,notify )

随机推荐

  1. android Broadcast 广播 注册方式
  2. Android(安卓)mdpi ldpi hdpi区别(转)
  3. 举例说明如何在android中实现设置黑名单
  4. Android(安卓)+ Axis2
  5. Git和Repo扫盲——如何取得Android源代码
  6. ubuntu 搭建android环境
  7. Android(安卓)Web App官方文档翻译第四章
  8. android HttpClient+WebView 同步session
  9. Android呼出电话流程(原)
  10. android关于轮询的一种解决方案