⑴ android中进程与线程及如何在子线程中操作U
一个Android 程序默认情况只有一个进程,但是一个进程可以有多个线程。其中有一个UI 线程也称为UI主线程,UI Thread在Android程序运行的时候就被创建,主要是负责控制UI界面的显示、更新和控件交互。所有的Android应用程序组件----包括Activity、Service、Broadcast Receiver都在应用程序的主线程中运行。因此,任何组件中的费时操作处理都可能阻塞所有其他的组件、包括Service和可见的Activity。
在Android 中,对未响应的定义是:Activity对一个输入事件在5s内没有响应,或者Broadcast Receiver在10s内没有完成他的onReceive处理程序。对于任何不用直接和用户界面进行交互的重要处理,使用后台线程技术处理是非常重要的,将文件操作、网络交互、数据库、复杂计算调度到后台线程中完成非常重要,以免阻塞主线程。
方法一:Thread+Handler
开启一个新线程:new Thread(new MyThread()).start();
//通过Handler物件,通知主线程UI Thread来更新界面
Handler myHandler=new Handler(){
//此方法主要用于更新UI
public void handleMessage(Message msg){
switch(msg.what){
//根据Thread返回的标识进行相应的处理
}
}
};
class MyThread implements Runnable{
public void run(){
int what=0;
//将耗时操作放到这里处理
//to-do
⑵ android开发开想要在一个方法中将子线程计算的数据返回怎么做
先实例化一个Handler再重写handleMessage(Messagemsg)方法msg.getData().getXXX()获得Thread线程发送的数据
⑶ 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 如何创建子线程以及区分主线程
在一个Android 程序开始运行的时候,会单独启动一个Process。默认的情况下,所有这个程序中的Activity或者Service(Service和 Activity只是Android提供的Components中的两种,除此之外还有Content Provider和Broadcast Receiver)都会跑在这个Process。
一个Android 程序默认情况下也只有一个Process,但一个Process下却可以有许多个Thread。在这么多Thread当中,有一个Thread,我们称之为UI Thread。UI Thread在Android程序运行的时候就被创建,是一个Process当中的主线程Main Thread,主要是负责控制UI界面的显示、更新和控件交互。在Android程序创建之初,一个Process呈现的是单线程模型,所有的任务都在一个线程中运行。因此,我们认为,UI Thread所执行的每一个函数,所花费的时间都应该是越短越好。而其他比较费时的工作(访问网络,下载数据,查询数据库等),都应该交由子线程去执行,以免阻塞主线程。
那么,UI Thread如何和其他Thread一起工作呢?常用方法是:
诞生一个主线程的Handler物件,当做Listener去让子线程能将讯息Push到主线程的Message Quene里,以便触发主线程的handlerMessage()函数,让主线程知道子线程的状态,并在主线程更新UI。
⑸ android应用程序开发,为串口接收数据创建的子线程问题,急!
找Bug应该要有条理,我们首先不能确定"每次都去执行while(value2 != 1)以外的代码",因为程序执行的很快,可能收发很快,循环每妙执行多少次不确定,而且你的阻塞时间还是0,最好循环内外加上输出判断是不是每次都执行循环体外的代码。
再就是你创建的是两个循环,开头
fd = HardwareControler.openSerialPort("/dev/ttyUSB0", buaterate, 8, 1);
每次读取完数据都会给fd重新赋值, 不确定打开串口是否有应答数据,如果有的话
打开串口->应答数据->有数据,执行第二个循环->读数据->重新第一个循环
这样可能会一直有数据,可把fd = HardwareControler.openSerialPort("/dev/ttyUSB0", buaterate, 8, 1);放到第一个循环外面。
这些只是推测,需要你根据自己代码慢慢调试。
⑹ android监听方法是开启一个子线程在执行
对于线程的控制,我们将介绍一个Handler类,使用该类可以对运行在不同线程中的多个任务进行排队,并使用Message和Runnable对象安排这些任务。在javadoc中,对Handler是这样解释的:Handler可以发送和处理消息对象或Runnable对象,这些消息对象和Runnable对象与一个线程相关联。每个Handler的实例都关联了一个线程和线程的消息队列。当创建了一个Handler对象时,一个线程或消息队列同时也被创建,该Handler对象将发送和处理这些消息或Runnable对象。
⑺ android创建子线程
你是要怎么个意思?
创建子线程即就是在你的程序体(也就是MainThread)中创建子线程:
1、匿名内部类对Thread类进行覆写:new
Thread(){
覆写run方法
}.start();
2、或者
new
Thread(new
Runnable(){········}).start();套用两层匿名内部类也可以
3、再或者就是将当前类继承Runnable然后在当前类里覆写上run方法,最后在需要开线程的地方写上new
Thread(this).start();
####别忘了在更新UI的时候跳回主线程就行了,用runOnUiThread
和handle机制都可以####
⑻ android中什么是主线程什么是子线程
一个app开始运行就会创建一个主线程,其他子线程都是在主线程中创建的。每个app都有一个主线程,但每个app并不一定有子线程。
⑼ android studio ndk 开发怎么开一个子线程
建立项目,并设置activity.xml布局文件,这一点与普通编程没有不同。通过一个简单的文本展示实验。
在MainActivity中添加native接口,并加载.so库
生成项目的.class文件。首先选中项目后,在菜单栏选择Build-->Make Project。
Make之后,将生成.class文件,生成的.class文件位于app_path/build/intermediates/classes/debug/包名
利用javah生成C头文件:点击"View->Tool Windows->Terminal",即在Studio中进行终端命令行工具。在控制台中通过命令“cd app\src\main\java”,进入到java目录下。操作指令:javah -d ../jni vrlab.ndkdemoforandroidstudio.MainActivity。此时在main目录下生成一个jni文件夹,其中在jni文件夹中有生成的.h头文件。
编辑C文件,在jni文件夹下新建文件命名为main.c。并在该文件中导入需要的头文件,实现上一步生成的头文件中的方法。
配置NDK路径,在local.properties中指明sdk和ndk路径:
设置ndk参数,名字、发布平台等。在应用目录下的build.gradle中defaultConfig中设置
生成.so文件,此时再次选择Build-->Build Project就可以生成so文件了。出现不支持NDK的错误提示,不过跟着错误提示修改:在项目空间下的gradle.properties中添加android.useDeprecatedNdk=true。
针对三种不同的CPU生成了三种不同的.so文件。生成的.so文件位于app_path/build/intermediates/ndk/debug/lib.
安装运行~~去吧,皮卡丘
⑽ android 子线程里开子线程吗
可以啊,没影响的,只要注意不要在线程更新ui就行了