展开全部
方法有两种:
通过继承Thread类,重写Run方法来实现
通过继承接口Runnable实现多线程
主要接受子线程发送的数据, 并用此数据配合主线程更新UI.
Handler的主要作用:主要用于异步消息的处理
Handler的运行过程:
当(子线程)发出一个消息之后,首先进入一个(主线程的)消息队列,发送消息的函数即刻返回,而在主线程中的Handler逐个的在消息队列中将消息取出,然后对消息进行处理。这样就实现了跨线程的UI更新(实际上还是在主线程中完成的)。
这种机制通常用来处理相对耗时比较长的操作,如访问网络比较耗时的操作,读取文大文件,比较耗时的操作处理等。
在大白话一点的介绍它的运行过程:
启动应用时Android开启一个主线程
(也就是UI线程) , 如果此时需要一个耗时的操作,例如:
联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象(这也就是你在主线程中直接访问网络时会提示你异常的原因,如我们上篇文章所述Android主线程不能访问网络异常解决办法)。
通过继承Thread类,重写Run方法来实现
通过继承接口Runnable实现多线程
主要接受子线程发送的数据, 并用此数据配合主线程更新UI.
Handler的主要作用:主要用于异步消息的处理
Handler的运行过程:
当(子线程)发出一个消息之后,首先进入一个(主线程的)消息队列,发送消息的函数即刻返回,而在主线程中的Handler逐个的在消息队列中将消息取出,然后对消息进行处理。这样就实现了跨线程的UI更新(实际上还是在主线程中完成的)。
这种机制通常用来处理相对耗时比较长的操作,如访问网络比较耗时的操作,读取文大文件,比较耗时的操作处理等。
在大白话一点的介绍它的运行过程:
启动应用时Android开启一个主线程
(也就是UI线程) , 如果此时需要一个耗时的操作,例如:
联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象(这也就是你在主线程中直接访问网络时会提示你异常的原因,如我们上篇文章所述Android主线程不能访问网络异常解决办法)。
展开全部
用AsyncTask异步类吧,我给你贴个DEMO
class AsyncLoader extends AsyncTask<Integer, Integer, Integer> {
int index;
public AsyncLoader(int index) {
//下面是显示用正在加载中的DIALOG联网布局引用的代码
// this.index = index;
//dialog = new AlertDialog.Builder(activity).show();
// dialog.setContentView(infoUtil.getDialogProgressView());
}
@Override
//这步被用于执行较长时间的后台计算。异步任务的参数也被传到这步。计算的结果必须在这步//返回,将传回到上一步。在执行过程中可以调用publishProgress(Progress...)来更新任务的进//度。在执行完onPreExecute() 方法后执行
protected Integer doInBackground(Integer... params) {
//这个事获取服务器数据的方法
getData(index);
return 1;
}
@Override
//异步类的静态方法在UI线程上调用任务后立即执行。这步通常被用于设置任务,例如在用户界//面显示一个进度条。
protected void onPreExecute() {
super.onPreExecute();
}
@Override
//当后台计算结束时,调用 UI线程。后台计算结果作为一个参数传递到这步,也就是//doInBackground(Integer... params)的结果
protected void onPostExecute(Integer result) {
super.onPostExecute(result);
if (dialog != null && dialog.isShowing())
//这个是那个正在加载中的DIALOG对话框,消失以后开始执行更新UI
dialog.dismiss();
//这个事里面要更新的UI的操作
updateUI(index);
}
@Override
//后台调用UI线程,执行时间不确定
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
@Override
protected void onCancelled() {
super.onCancelled();
}
}
class AsyncLoader extends AsyncTask<Integer, Integer, Integer> {
int index;
public AsyncLoader(int index) {
//下面是显示用正在加载中的DIALOG联网布局引用的代码
// this.index = index;
//dialog = new AlertDialog.Builder(activity).show();
// dialog.setContentView(infoUtil.getDialogProgressView());
}
@Override
//这步被用于执行较长时间的后台计算。异步任务的参数也被传到这步。计算的结果必须在这步//返回,将传回到上一步。在执行过程中可以调用publishProgress(Progress...)来更新任务的进//度。在执行完onPreExecute() 方法后执行
protected Integer doInBackground(Integer... params) {
//这个事获取服务器数据的方法
getData(index);
return 1;
}
@Override
//异步类的静态方法在UI线程上调用任务后立即执行。这步通常被用于设置任务,例如在用户界//面显示一个进度条。
protected void onPreExecute() {
super.onPreExecute();
}
@Override
//当后台计算结束时,调用 UI线程。后台计算结果作为一个参数传递到这步,也就是//doInBackground(Integer... params)的结果
protected void onPostExecute(Integer result) {
super.onPostExecute(result);
if (dialog != null && dialog.isShowing())
//这个是那个正在加载中的DIALOG对话框,消失以后开始执行更新UI
dialog.dismiss();
//这个事里面要更新的UI的操作
updateUI(index);
}
@Override
//后台调用UI线程,执行时间不确定
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
@Override
protected void onCancelled() {
super.onCancelled();
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Android不允许在其他子线程更新主线程的UI,只能在主线程中进行UI操作。除了SurfaceView特殊,可以在线程中更新,否则其他UI操作只能在主线程中进行。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
android中非UI线程是不能对UI进行操作的,你可以在单独线程执行耗时操作,然后通过Handler去更新UI。或者你可以使用AsyncTask。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
android中非UI线程是不能对UI进行操作的,你可以在单独线程执行耗时操作,然后通过Handler去更新UI。或者你可以使用AsyncTask。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询