当前位置:首页 » 安卓系统 » android多线程处理

android多线程处理

发布时间: 2022-07-05 09:13:12

⑴ 简述android多线程机制

Handler对象与其调用者在同一线程中,如果在Handler中设置了延时操作,则调用线程也会堵塞。每个Handler对象都会绑定一个Looper对象,每个Looper对象对应一个消息队列(MessageQueue)。如果在创建Handler时不指定与其绑定的Looper对象,系统默认会将当前线程的Looper绑定到该Handler上。在主线程中,可以直接使用newHandler()创建Handler对象,其将自动与主线程的Looper对象绑定;在非主线程中直接这样创建Handler则会报错,因为Android系统默认情况下非主线程中没有开启Looper,而Handler对象必须绑定Looper对象。这种情况下,需先在该线程中手动开启Looper(Looper.prepare()-->Looper.loop()),然后将其绑定到Handler对象上;或者通过Looper.getMainLooper(),获得主线程的Looper,将其绑定到此Handler对象上。Handler发送的消息都会加入到Looper的MessageQueue中。一说Handler包含两个队列:线程队列和消息队列;使用Handler.post()可以将线程对象加入到线程队列中;使用Handler.sendMessage()可以将消息对象加入到消息队列中。通过源码分析证实,Handler只有一个消息队列,即MessageQueue。通过post()传进去的线程对象将会被封装成消息对象后传入MessageQueue。使用post()将线程对象放到消息队列中后,当Looper轮询到该线程执行时,实际上并不会单独开启一个新线程,而仍然在当前Looper绑定的线程中执行,Handler只是调用了该线程对象的run()而已。如,在子线程中定义了更新UI的指令,若直接开启将该线程执行,则会报错;而通过post()将其加入到主线程的Looper中并执行,就可以实现UI的更新。使用sendMessage()将消息对象加入到消息队列后,当Looper轮询到该消息时,就会调用Handler的handleMessage()来对其进行处理。再以更新UI为例,使用这种方法的话,就先将主线程的Looper绑定在Handler对象上,重载handleMessage()来处理UI更新,然后向其发送消息就可以了。

⑵ Android 多线程与Java多线程比较 有哪些区别

在一个程序中,这些独立运行的程序片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。多线程处理一个常见的例子就是用户界面。利用线程,用户可按下一个按钮,然后程序会立即作出响应,而不是让用户等待程序完成了当前任务以后才开始响应。简单地说,就是说可以有多个任务同时进行。
单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行。因此,针对前面举的例子,必须等待程序完成了当前任务以后才能开始相应。

使用多线程访问公共的资源时,容易引发线程安全性问题,因此针对这种需要使用线程同步机制来保护公共的资源。
单线程较多线程来说,就不会出现上诉问题,系统稳定、扩展性极强、软件丰富。多用于点对点的服务。

⑶ android怎么调试多线程,Log大法吗,太苦逼了吧

1.arm-eabi-addr2line 类似libxxx.so 0x00012345调用栈16进制值翻译文件名函数名
arm-eabi-addr2line -e libxxx.so 0x00012345
2.arm-eabi-nm 列文件符号信息
arm-eabi-nm -l -C -n -S libdvm.so > dvm.data
3.arm-eabi-objmp 列文件详细信息
arm-eabi-objmp -C -d libc.so > libc.s
通工具析 我较完整调用栈及调用逻辑汇编码
需要结合ARM架构及ARM汇编知识(些情况能需要使用gdb)
析现tombstone原本遇些tombstone情况:
1.效函数指针:指针NULL或者已经重新赋值
2.strlen崩溃:导致完全栈信息栈破坏
3.FILE操作:stdio并非线程安全线程操作容易现异
-

⑷ android多线程

这个线程就是每次增加图片的alpha值来实现图片慢慢显示的,因为程序要在onCreat完成之后才显示,你如果在oncreat里边跑那个循环,那么onCreat方法事实上一直没完成,所以一直显示黑色。要想去掉线程外壳,可以试试在触发事件里执行

⑸ Android开发中多线程与UI更新

直接在UI线程中开启子线程来更新TextView显示的内容,运行程序我们会发现,如下错误:android.view.ViewRoot$: Only the original thread that created a view hierarchy can touch its views.翻译过来就是:只有创建这个控件的线程才能去更新该控件的内容。

所有的UI线程要去负责View的创建并且维护它,例如更新冒个TextView的显示,都必须在主线程中去做,我们不能直接在UI线程中去创建子线程,要利用消息机制:handler,如下就是handler的简单工作原理图:

既然android给我们提供了Handler机制来解决这样的问题,请看如下代码:

public class HandlerTestActivity extends Activity { private TextView tv; private static final int UPDATE = 0; private Handler handler = new Handler() { @Overridepublic void handleMessage(Message msg) { // TODO 接收消息并且去更新UI线程上的控件内容if (msg.what == UPDATE) { // Bundle b = msg.getData();// tv.setText(b.getString("num")); tv.setText(String.valueOf(msg.obj)); } super.handleMessage(msg); } }; /** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv = (TextView) findViewById(R.id.tv); new Thread() { @Overridepublic void run() { // TODO 子线程中通过handler发送消息给handler接收,由handler去更新TextView的值try { for (int i = 0; i < 100; i++) { Thread.sleep(500); Message msg = new Message(); msg.what = UPDATE; // Bundle b = new Bundle();// b.putString("num", "更新后的值:" + i);// msg.setData(b); msg.obj = "更新后的值:" + i; handler.sendMessage(msg); } } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); }}

我们就通过Handler机制来处理了子线程去更新UI线程控件问题,Andrid开发中要经常用到这种机制。

⑹ Android开发中如何使用多线程

handler其实就是消息处理机制。首先在主线程也就是UI创建一个Handler对象,复写其中的handMessage( Message msg)方法。该方法里的msg就是子线程发来的消息,表示子线程处理完了,以这个msg来通知主线程。让主线程来作UI的绘制工作。

那么子线程工作完了就要发消息了,比如:
run(){
data = getDataFromInternet();//耗时工作
Message msg = handler.obtainMessage(0, data);//通过handler得到消息,该消息的标识为0,消息内容是data
handler.sendMessage(msg);//发送
}
然后handler在主线程就负责接收:
public Handler handler = new Handler(){//处理UI绘制

@SuppressWarnings("unchecked")
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
data = (List<Map<String, Object>>) msg.obj;
if(data == null){
Toast.makeText(AllMovieActivity.this, "网络连接失败,获取不到影片信息", 1).show();
}else {

adapter = new HotMoviedapter(AllMovieActivity.this, data, R.layout.allmovielist_item,
new String[] { "picurl", "chname", "director", "leadrole",
"fshowtime", "country" }, new int[] { R.id.picurl,
R.id.chname, R.id.director, R.id.leadrole,
R.id.fshowtime, R.id.country },mListView);
TextView v = new TextView(AllMovieActivity.this);
v.setHeight(80);
v.setSelectAllOnFocus(false);
mListView.addFooterView(v);
mListView.setAdapter(adapter);
}
break;

default:
break;
}
}
};

⑺ android 多线程里面有什么优化的

一:为什么不能在onCreate中使用open_file.handler.post(this)你在onCreate方法中调用open_file.handler.post(this),意味着你把耗时的任务(publicvoidrun()中的工作)又扔给了主线程的消息队列,当主线程处理这个消息时,岂不是被阻塞了?所以,你应该在onCreate中使用t=newThread(this);t.start();二、为什么不能更新视图((open_file)open_file.open_file1).initData_1(file_all);//刷新主线程视图这里应该这样写:@Overridepublicvoidrun(){file_all=open_ok.OK_All(Constant.SD);open_file.handler.post(newRunnable(){publicvoidrun()//这里run的操作将扔回主线程消息队列{((open_file)open_file.open_file1).initData_1(file_all);//不可以耗时很长哦}});}由于你的代码不完整,我给的代码也可能需要修改。总之思路就是这个样子。

⑻ android多核,多线程该如何用

在程序开发的实践当中,为了让程序表现得更加流畅,我们肯定会需要使用到多线程来提升程序的并发执行性能。但是编写多线程并发的代码一直以来都是一个相对棘手的问题,所以想要获得更佳的程序性能,我们非常有必要掌握多线程并发编程的基础技能。
众所周知,Android 程序的大多数代码操作都必须执行在主线程,例如系统事件(例如设备屏幕发生旋转),输入事件(例如用户点击滑动等),程序回调服务,UI 绘制以及闹钟事件等等。那么我们在上述事件或者方法中插入的代码也将执行在主线程。

一旦我们在主线程里面添加了操作复杂的代码,这些代码就很可能阻碍主线程去响应点击/滑动事件,阻碍主线程的 UI 绘制等等。我们知道,为了让屏幕的刷新帧率达到 60fps,我们需要确保 16ms 内完成单次刷新的操作。一旦我们在主线程里面执行的任务过于繁重就可能导致接收到刷新信号的时候因为资源被占用而无法完成这次刷新操作,这样就会产生掉帧的现象,刷新帧率自然也就跟着下降了(一旦刷新帧率降到 20fps 左右,用户就可以明显感知到卡顿不流畅了)。

为了避免上面提到的掉帧问题,我们需要使用多线程的技术方案,把那些操作复杂的任务移动到其他线程当中执行,这样就不容易阻塞主线程的操作,也就减小了出现掉帧的可能性。

那么问题来了,为主线程减轻负的多线程方案有哪些呢?这些方案分别适合在什么场景下使用?Android 系统为我们提供了若干组工具类来帮助解决这个问题。
AsyncTask: 为 UI 线程与工作线程之间进行快速的切换提供一种简单便捷的机制。适用于当下立即需要启动,但是异步执行的生命周期短暂的使用场景。
HandlerThread: 为某些回调方法或者等待某些任务的执行设置一个专属的线程,并提供线程任务的调度机制。
ThreadPool: 把任务分解成不同的单元,分发到各个不同的线程上,进行同时并发处理。
IntentService: 适合于执行由 UI 触发的后台 Service 任务,并可以把后台任务执行的情况通过一定的机制反馈给 UI。
了解这些系统提供的多线程工具类分别适合在什么场景下,可以帮助我们选择合适的解决方案,避免出现不可预期的麻烦。虽然使用多线程可以提高程序的并发量,但是我们需要特别注意因为引入多线程而可能伴随而来的内存问题。举个例子,在 Activity 内部定义的一个 AsyncTask,它属于一个内部类,该类本身和外面的 Activity 是有引用关系的,如果 Activity 要销毁的时候,AsyncTask 还仍然在运行,这会导致 Activity 没有办法完全释放,从而引发内存泄漏。所以说,多线程是提升程序性能的有效手段之一,但是使用多线程却需要十分谨慎小心,如果不了解背后的执行机制以及使用的注意事项,很可能引起严重的问题。

⑼ android 多线程怎么处理

1)进程和线程的概念;
2)Java中的线程,在Java中创建线程的方式;
3)Android中的线程,包括:Message、Handler、Looper和HandlerThread等概念。

⑽ 浅谈Android中多线程切换的几种方法

Java提供了线程类Thread来创建多线程的程序。其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象。每个Thread对象描述了一个单独的线程。要产生一个线程,有两种方法:
◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法;
◆实现Runnalbe接口,重载Runnalbe接口中的run()方法。

热点内容
如何重置手机密码realme 发布:2024-05-06 14:57:25 浏览:347
自己搭建外网服务器违法吗 发布:2024-05-06 14:56:32 浏览:629
苹果安卓哪个步数准确 发布:2024-05-06 14:43:58 浏览:239
安卓手机软件用什么编程语言写 发布:2024-05-06 14:30:07 浏览:657
des解密python 发布:2024-05-06 14:30:06 浏览:684
n的阶乘算法 发布:2024-05-06 14:29:57 浏览:552
安卓手机为什么停服 发布:2024-05-06 14:29:08 浏览:93
电脑服务器不运行是怎么回事 发布:2024-05-06 14:20:28 浏览:791
肥皂板解压视频大全 发布:2024-05-06 14:20:27 浏览:260
ps4各个服务器有什么区别 发布:2024-05-06 14:10:38 浏览:485