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);
}
};
}
分享到:
相关推荐
在Android应用开发中,文件上传是一项常见的任务,尤其是在处理大文件或者需要提高用户交互体验时,多线程技术显得尤为重要。本主题聚焦于"Android多线程文件上传",我们将探讨如何利用多线程技术来优化文件上传过程...
在Android应用开发中,多线程是一个至关重要的概念,它...通过分析提供的文件名,我们可以推测这个实例可能是关于如何在后台线程加载数据并在UI线程更新进度的一个教程,这对于理解和实践Android多线程开发非常有帮助。
这个"Android多线程分段下载源码"实例是一个很好的学习资源,它实现了文件的分块下载,并允许用户自定义线程数来控制下载速度和效率。下面我们将详细探讨这一技术。 首先,我们要理解什么是分段下载。传统的单线程...
2. 采用handler+Thread模式实现多线程异步加载; 3. 引入线程池来管理多线程 4. 引入线程池,并引入内存缓存功能,并对外部调用封装了接口,简化调用过程 参考:...
在Android开发中,多线程异步下载图片是一项常见的需求,尤其在开发涉及大量图片展示的应用时,如社交应用、电商应用等。这样的技术能够提高用户体验,避免UI卡顿,因为图片加载工作不会阻塞主线程。下面我们将深入...
1. **使用异步任务(AsyncTask)**:Android提供了AsyncTask类,适合执行耗时操作,但其线程池大小有限,适用于小规模的多线程下载。 2. **使用Handler和Looper**:创建一个后台线程,通过Handler与主线程通信,...
总结,这个资源包为Android开发者提供了全面的多线程编程知识,包括理论讲解、实战技巧以及辅助工具,是提升Android应用性能和响应性的重要参考资料。学习并掌握这些内容,将有助于开发者编写出更加高效、流畅的应用...
在实际开发中,可以使用Android的`DownloadManager`类,这是一个系统服务,提供了多线程下载、断点续传和自动处理网络错误等功能。但如果你需要更细粒度的控制,如自定义进度显示或更复杂的逻辑,可能需要自己实现...
params)`:这个方法在后台线程中运行,执行实际的耗时操作,如下载图片。 3. `onProgressUpdate(Progress... values)`:当在`doInBackground()`中更新进度时,可以通过`publishProgress()`调用来在UI线程中显示进度...
通过安装`demo.apk`,你可以直观地看到多线程下载的运行效果,同时也可以参考代码学习具体的实现方法,这对于理解和掌握Android多线程下载技术非常有帮助。 总结,Android多线程下载是提升用户体验的重要手段,通过...
通过分析这个详细的demo,学生们可以逐步了解并掌握多线程的相关概念和技术,为日后的Android开发打下坚实的基础。在实际编程过程中,结合具体需求选择合适的方法,既能保证应用的流畅性,也能提高代码的可维护性。
本文将详细介绍如何在Android中实现多线程断点下载,以及如何封装一个易于使用的接口,使得即使是对Android不太熟悉的开发者也能快速上手。 首先,我们要理解什么是多线程下载。传统的单线程下载方式只有一个线程...
首先,我们要理解为什么需要多线程下载。在单线程下载中,数据流从服务器到客户端是连续的,如果网络状况不佳或者文件体积过大,下载速度可能会非常慢。而多线程下载则是将大文件分割成多个小块,通过不同的网络连接...
这就是多线程下载的核心思想,通过创建多个子线程,每个线程负责下载文件的一部分,从而在后台高效地完成下载任务。 1. **线程池和ExecutorService**: Android开发者可以使用Java的`ExecutorService`来管理和调度...
通过这个"Android异步线程使用Demo",开发者可以学习到如何在Android中正确地使用AsyncTask来实现异步操作,避免主线程阻塞,提升用户体验。同时,理解AsyncTask的工作机制有助于在实际项目中更好地管理后台任务。
为了解决这个问题,Android提供了多线程技术来实现异步加载图片,使得应用能够流畅运行。本示例将围绕"android多线程下载图片例子"这一主题,深入探讨Android中异步加载图片的机制,并结合"AndroidUploadImages"这一...
综上所述,这个"android 多线程下载源代码"涵盖了Android并发编程、网络通信、文件操作等多个重要知识点,对于提升Android开发者处理大文件下载的能力非常有帮助。通过深入学习和实践,开发者可以更好地理解和掌握...
在Android开发中,进行大文件下载时,为了提高效率并充分利用设备资源,通常会采用多线程下载技术。此外,为了提升用户体验,断点续传功能也显得尤为重要,尤其是在网络不稳定或者用户中断下载后,可以从上次停止的...
android多线程后台下载示例程序,android多线程后台下载示例程序,android多线程后台下载示例程序,android多线程后台下载示例程序,android多线程后台下载示例程序,android多线程后台下载示例程序
标题"android——多线程"和描述"android——Handler与多线程应用范例"暗示我们将深入探讨如何在Android中使用Handler来管理多线程。 Android系统默认运行在一个单线程环境中,即主线程,也被称为UI线程。主线程主要...