android多线程编程
‘壹’ 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开发中要经常用到这种机制。
‘贰’ 安卓在多线程编程中怎样保证线程安全
1.将整个类加锁 (代码为synchronized(this))
2.定义一个object,访问某些相关变量是,对该对象加锁(代码为synchronized(lockobj))。
新应用发布前如条件允许,最好做一下代码混淆,市面上各种外挂或者篡改数据什么的也比较常见,避免被破解利用。可以在一定程度上保护自己核心代码算法,提高破解/盗版/二次打包的难度,缓解代码注入/动态调试/内存注入攻击等
但也对应用的兼容性有一定影响,加壳技术不行的话,还会影响程序运行效率.
目前市面上有很多第三方加壳的平台, 如果应用需要加壳要选择的话,可以先试试免费的,例如腾讯御安全,建议先去加固个包测试下兼容性。
‘叁’ Android 多线程与Java多线程比较 有哪些区别
在一个程序中,这些独立运行的程序片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。多线程处理一个常见的例子就是用户界面。利用线程,用户可按下一个按钮,然后程序会立即作出响应,而不是让用户等待程序完成了当前任务以后才开始响应。简单地说,就是说可以有多个任务同时进行。
单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行。因此,针对前面举的例子,必须等待程序完成了当前任务以后才能开始相应。
使用多线程访问公共的资源时,容易引发线程安全性问题,因此针对这种需要使用线程同步机制来保护公共的资源。
单线程较多线程来说,就不会出现上诉问题,系统稳定、扩展性极强、软件丰富。多用于点对点的服务。
‘肆’ android多线程编程中,怎样保证线程安全
有。 用 FutureTask 。
解释: 主体工作你已经完成一半了。 目前的状态是, 好比你分配完任务让线程去处理。
线程还没处理完,你还没有得到结果你就先回去了。
怎么等待某一个任务完成呢? 在 Java 中你可以使用 FutureTask<V> 还封装你的任务,表示这是一个将来某一个时间完成的任务,我们一般叫做异步任务。
FutureTask<V> 主要是,在你调用它的`get` 方法时,哪颗它还没有完成就在那里等着,完成再返回给你结果。
‘伍’ Android开发中有哪些需要注意的多线程问题
方式1: 继承Thread类,创建一个新的线程类。
private class thread extends Thread{
private Context act;
public thread(Context con){
act = con;
}
@Override
public void run() {
super.run();
//想要放到后台线程做的事情都写在这里。
}
‘陆’ android 大量多线程怎么优化
在程序开发的实践当中,为了让程序表现得更加流畅,我们肯定会需要使用到多线程来提升程序的并发执行性能。但是编写多线程并发的代码一直以来都是一个相对棘手的问题,所以想要获得更佳的程序性能,我们非常有必要掌握多线程并发编程的基础技能。
众所周知,Android 程序的大多数代码操作都必须执行在主线程,例如系统事件(例如设备屏幕发生旋转),输入事件(例如用户点击滑动等),程序回调服务,UI 绘制以及闹钟事件等等。那么我们在上述事件或者方法中插入的代码也将执行在主线程。
一旦我们在主线程里面添加了操作复杂的代码,这些代码就很可能阻碍主线程去响应点击/滑动事件,阻碍主线程的 UI 绘制等等。我们知道,为了让屏幕的刷新帧率达到 60fps,我们需要确保 16ms 内完成单次刷新的操作。一旦我们在主线程里面执行的任务过于繁重就可能导致接收到刷新信号的时候因为资源被占用而无法完成这次刷新操作,这样就会产生掉帧的现象,刷新帧率自然也就跟着下降了(一旦刷新帧率降到 20fps 左右,用户就可以明显感知到卡顿不流畅了)。
为了避免上面提到的掉帧问题,我们需要使用多线程的技术方案,把那些操作复杂的任务移动到其他线程当中执行,这样就不容易阻塞主线程的操作,也就减小了出现掉帧的可能性。
那么问题来了,为主线程减轻负的多线程方案有哪些呢?这些方案分别适合在什么场景下使用?Android 系统为我们提供了若干组工具类来帮助解决这个问题。
AsyncTask: 为 UI 线程与工作线程之间进行快速的切换提供一种简单便捷的机制。适用于当下立即需要启动,但是异步执行的生命周期短暂的使用场景。
HandlerThread: 为某些回调方法或者等待某些任务的执行设置一个专属的线程,并提供线程任务的调度机制。
ThreadPool: 把任务分解成不同的单元,分发到各个不同的线程上,进行同时并发处理。
IntentService: 适合于执行由 UI 触发的后台 Service 任务,并可以把后台任务执行的情况通过一定的机制反馈给 UI。
了解这些系统提供的多线程工具类分别适合在什么场景下,可以帮助我们选择合适的解决方案,避免出现不可预期的麻烦。虽然使用多线程可以提高程序的并发量,但是我们需要特别注意因为引入多线程而可能伴随而来的内存问题。举个例子,在 Activity 内部定义的一个 AsyncTask,它属于一个内部类,该类本身和外面的 Activity 是有引用关系的,如果 Activity 要销毁的时候,AsyncTask 还仍然在运行,这会导致 Activity 没有办法完全释放,从而引发内存泄漏。所以说,多线程是提升程序性能的有效手段之一,但是使用多线程却需要十分谨慎小心,如果不了解背后的执行机制以及使用的注意事项,很可能引起严重的问题。
‘柒’ Android 异步任务中允许有多个线程同时进行吗
允许的,异步多线程下载就是这样
‘捌’ ANDROID,JAVA编程,怎样才能传递参数给线程
线程之间允许共享一些参数变量,你说的不同数目的参数,是不是可以用ArrayList或者数组来解决。
还有一种就是类似于main函数的形式:
public static void test(Object...objects) {
}
可变参数,jdk5以上支持。
调用可以这样:test(a,b,c,d);
如果需要一个线程进行运算,并且等待线程运算完成并获取结果,
参考下线程池、AsyncTask。
‘玖’ android客户端进行多线程编程的基本流程是怎样的
话分两头:
第一:从RecentApp界面被划掉后,系统做了什么:
系统将这个应用的UI线程杀死,并将此应用当前所分配的内存空间回收。
第二:为什么系统将UI线程杀死,将内存回收后,程序还能继续工作?比如音乐还在继续响起:
这是因为有一类应用,为了当用户将此应用的界面调到后台后,仍然是可以工作,这些应用都会在后台开一个Service,你可以理解为一个区别于UI线程的另一个线程,它可以独立于UI线程之外,当UI线程被挂起或者销毁时,它可以接替UI线程的工作,让程序员继续work。所以,为什么有时候程序被从Recent列表中删除后,程序没有停止,这里的停止,实质上是程序的某一功能没有停止,比如音乐,而此时的程序UI界面以及其它无关的内存已经被告系统回收了。
第三:如何让自己的应用不出现在Recent列表里:
‘拾’ 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;
}
}
};