Can my single-threaded application benefit from multiple cores? How?

Even a single-threaded application can benefit from parallel processing on different cores. For example, if your application uses a media server, then the media processing and your UI rendering application logic can run on different cores at the same time. Also, the garbage collector can run on a different core.

How can I write code that takes advantage of multiple cores?

To realize the maximum potential of the available processing power on multi-core devices, write your application with concurrency in mind. The application should be designed so that tasks which can be executed in parallel are set up to run on separate threads.

The UI Thread

In Android, the main thread is the same as the UI thread. This thread is responsible for handling all the UI events.

When you’re writing multi-threaded applications in Android, keep these things in mind about the UI thread (or main thread):

  • Only the main thread should update the UI. All other threads in the application should return data back to the main thread to update the UI.
  • There is no single point of entry in an Android application. An Android application can be entered from an Activity, Service or a Broadcast Receiver, all of which run on the UI thread.
  • Very important – The UI thread should not perform tasks that take longer than a few seconds, or else you run the risk of a sluggish user experience in your app. Read Android documentation about Keeping Your App Responsive to learn more.

As a rule of thumb, whenever your application needs to perform a longer task(s) from the UI thread, then it should parallelize using one of the parallelization techniques provided by Android: Java threads, AsyncTask or IntentService.

Parallelization technique: Java threads

The standard ways of creating threads in Java are also available in Android: extending the Thread class or implement the Runnable interface. However, if you want to pass messages to and from a thread, you need to implement message queues using android.os.Message, android.os.Handler, android.os.Looper, etc.

Also, if your application involves creating multiple threads then you might have to take care of multi-threading concurrency issues like race conditions, deadlocks and starvation. To learn more about Java threads and message passing between threads, read through the Java tutorial, Defining and Starting a Thread.

When should I use Java threads for parallelization?

When you want to parallelize tasks running longer than a few seconds, you should use Java threads from the UI thread. Android provides other, easier ways to parallelize, like AsyncTask and IntentService, so for most simple applications you may not need Java threads.

Parallelization technique: AsyncTask

AsyncTask provides the functionality to run short tasks (a couple of seconds long) in the background from the UI thread using a method called doInBackground(). You do not need to implement any message passing to and from the UI thread.  An AsyncTask uses 3 types of data:

  • Params - parameters passed to the background method as inputs.
  • Progress - data passed to the UI thread for updating progress.
  • Result - data returned from the background method upon completion.

You can implement an AsyncTask using the following steps, found in Android’s AsyncTask documentation:

  • Extend the AsyncTask class.
  • Implement the following methods:
    • onPreExecute() - performs setup like showing a progress dialog before executing the task. This method is invoked on the UI thread.
    • doInBackground(Params...) - executes all of the code that you want to run in the background and sends updates to onProgressUpdate() and the result to onPostExecute(Result). It is invoked on a pool of background threads.
    • onProgressUpdate() - invoked when publishProgress() is called from the doInBackground() method. It is invoked on the UI thread.
    • onPostExecute() - receives the return value from doInBackground(). It is invoked on the UI thread.
    • onCancelled() - invoked when cancel() is called. Invoked on the UI thread.
  • Create an instance of your extended AsyncTask class on the UI thread.
  • Call the execute() method.

Rules

  • Your extended AsyncTask class is executed by calling the execute() method, which runs on the UI thread and spawns a separate background thread to execute your task.
  • The order of execution of AsyncTask methods is: onPreExecute() -> doInBackground(Params…) -> onProgressUpdate() -> onPostExecute() or onCancelled().
  • None of the above methods can be invoked directly.
  • One instance of an AsyncTask can only be executed once. Execute should be called using multiple instances if you want to run multiple tasks.
  • An AsyncTask must be created on the UI thread.

When should I use an AsyncTask for parallelization?

Use an AsyncTask whenever you have a short background task which needs communication with the UI thread. AsyncTask is appropriate for short tasks only because it creates and manages threads for you, and you don't want to tie up resources with thread(s) that you did not create. Use Java threads and handlers from inside a service for longer-running (more than a few seconds) tasks. See the Android documentation on AsyncTask for more information.

转载:https://developer.qualcomm.com/blog/multi-threading-android-apps-multi-core-processors-part-1-2

Multi-threading Android Apps for Multi-core Processors – Part 1 of 2的更多相关文章

  1. Android apps for “armeabi-v7a” and “x86” architecture: SoC vs. Processor vs. ABI

    INSTRUCTION SET: Processors are made of semiconductor dies, usually electronic-grade mono-crystallin ...

  2. Android Apps开发环境搭建

    一 Android开发工具简介 用于Eclipse的Android开发工具(AdnroidDeveloper Tools,简称ADT)插件提供了专业级别的开发环境,利用该环境来构建AndroidApp ...

  3. Building Android Apps 30条建议

    Building Android Apps — 30 things that experience made me learn the hard way There are two kinds of ...

  4. Android Studio 3.0+ Annotation processors must be explicitly declared now

    把Android Studio 升级到3.0+ 版本的时候出现该问题:   可以看到 给了我们两种解决办法:   1. 即 给出现问题的三方 加上 annotationProcessor配置     ...

  5. Multi account chang login with multi -thread

    void worker_DoWork(object sender, DoWorkEventArgs e) { isBussy = true; if (Common.isChangingAccount) ...

  6. 创建Android Apps的30个经验教训

    这个世界上有两种人-从经验教训中学习的人以及听从别人建议的人.这里是我一路走来学到的一些东西,分享给大家: 在添加任何第三方party之前,请三思:这真的是一个成熟的项目吗? 如果一个东西用户看不到, ...

  7. Android开发训练之第五章——Building Apps with Connectivity & the Cloud

    Building Apps with Connectivity & the Cloud These classes teach you how to connect your app to t ...

  8. Multi Paxos

    Multi Paxos [2] 通过basic paxos 以上步骤分布式系统已经能确定一个值,“只确定一个值有什么用?这可解决不了我面临的问题.” 你心中可能有这样的疑问. 原simple paxo ...

  9. Android 1.5-7.0(持续更新)安全机制一览

    Android 1.5 ProPolice to prevent stack buffer overruns (-fstack-protector),在缓冲区buffer与返回地址之间加入Canary ...

随机推荐

  1. 大数据学习——linux常用命令(四)

    四 查到命令 1 查找可执行的命令所在的路径 which ls 查ls命令所在的路径 2 查找可执行的命令和帮助的位置 whereiis ls 3 从某个文件夹开始查找文件 find / -name ...

  2. css装饰文本框input

    在web程序前端页面中,<input>恐怕是用的最多的html元素了,各个需要录入信息的场合都会用到它,一般都会用css来修饰一下使得它更好看. 原始的不加修饰的文本框像下面,有些单调,页 ...

  3. 数字游戏(codevs 1085)

    题目描述 Description 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共 ...

  4. 【Ural1297】Palindrome(后缀数组)

    题意:求一个字符串的最长回文子串 n<=1000 思路:这是一道论文题 需要注意的细节: 1.奇偶分类 2.中间的分割符与最后的附加字母都是最小值,但两者不能相同,否则height可能会出现问题 ...

  5. BZOJ1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列

    n<=100000个数表示每头牛在K<=30种物品的选取情况,该数在二进制下某位为0表示不选1表示选,求一个最大的区间使区间内选择每种物品的牛一样多. 数学转化,把不同状态间单变量的关系通 ...

  6. Mysqli的常用函数

    Mysqli的常用函数 连接数据库: $res = @mysqli_connect($host,$username,$pass,$db_name); if (mysqli_connect_errno( ...

  7. poj2112 二分+floyd+多源多汇最大流

    /*此题不错,大致题意:c头牛去k个机器处喝奶,每个喝奶处最多容纳M头牛,求所有牛中走的最长路的 那头牛,使该最长路最小.思路:最大最小问题,第一灵感:二分答案check之.对于使最长路最短, 用fo ...

  8. 【.Net 学习系列】-- EF Core实践(Code First)

    一.开发环境: vs2015, .Net Framework 4.6.1 二.解决方案: 新建一个控制台应用程序 添加引用:Microsoft.EntityFrameworkCore.SqlServe ...

  9. Jmeter参数Parameters和Body Data区别

    1.如图: 2.有文章说,Parameters是get的参数:Body Data是post的参数:get的参数存在于url中,post的参数存在于body中:   但是我使用jmeter3.3版本测试 ...

  10. 【APUE】一个fork的面试题及字符设备、块设备的区别

    具体内容见:http://coolshell.cn/articles/7965.html 字符设备.块设备主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,而块设备则不然, ...