2020-10-08

    科技2026-04-03  14

    1、通过继承Thread类或者实现Runnable接口去实现 class TheadTask extends Thread{ @Override public void run() { Log.d(“MainActivity”,“TheadTask is running”); } }

    class ThreadRunnable implements Runnable{ @Override public void run() { Log.d("MainActivity","ThreadRunnable is running"); }

    1 2 3 4 5 6 7 8 9 10 11 12 13 //用继承自Thread方式来实现多线程 Thread task01=new TheadTask(); task01.start();

    Thread task02=new TheadTask(); task02.start(); //用实现Runnable方式来实现多线程 Thread task03=new Thread(new TheadTask()); task03.start();

    1 2 3 4 5 6 7 8 9 两种方式的区别:runnable是通过接口方式去实现的,因此可以用多个类去实现这个接口,通过接口,实现线程之间的数据共享。一般继承自Thread的无法共享数据。

    2、通过线程池去实现 //复用线程池的方式实现 ExecutorService executorService = Executors.newCachedThreadPool(); executorService.execute(new ExecutorServiceThread());

    //该线程池只有一个线程 ExecutorService singleExecutorService = Executors.newSingleThreadExecutor(); singleExecutorService.execute(new ExecutorServiceThread());

    1 2 3 4 5 6 7 class ExecutorServiceThread implements Runnable{

    @Override public void run() { Log.d("MainActivity","ExecutorServiceThread is running"); } }

    1 2 3 4 5 6 7 线程池里面可以使用已经创建好的线程,可以减少线程销毁创建时给程序带来的开销,当遇见调用频繁的任务时可以采用线程池的方式去实现

    3、通过继承AsyncTask实现 //目前谷歌弃用了,但是一些多线性框架还在使用 /** * 第一个参数 doInBackground参数 * 第二个参数onProgressUpdate的参数,如果不需要可以设为void * 第三个参数doInBackground返回值,onPostExecute的参数 */ class DownloadTask extends AsyncTask<String, Integer, String> { @Override protected void onPreExecute() { //在异步任务开始的时候准备资源 super.onPreExecute(); }

    //必须要实现 @Override protected String doInBackground(String... strings) { //执行复杂耗时的任务,一定要慎用 for (int i=0;i<100;i++){ publishProgress(i);//如果不需要发布进度,可以不处理 } return "AsyncTask任务"; } @Override protected void onProgressUpdate(Integer... values) { //更新进度,如果不需要的可以不实现,将第二个参数置空即可 super.onProgressUpdate(values); } @Override protected void onPostExecute(String s) { //在这里处理数据更新后的结果 super.onPostExecute(s); } }

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 //AsyncTask去执行 DownloadTask downloadTask=new DownloadTask(); //默认是串行,所以需要修改成并行 downloadTask.executeOnExecutor( AsyncTask.THREAD_POOL_EXECUTOR, “www.baidu.com” ); 1 2 3 4 5 6 7 很遗憾的是,AsyncTask在现在已经是被谷歌弃用了,在使用AsyncTask的时候也要时刻注意防止内存泄露,同时AsyncTaks默认是串行方式去执行任务的,因此当有多个任务的时候,需要设置为并行方式 executeOnExecutor,AsyncTask.THREAD_POOL_EXECUTOR,去提高效率。虽然现在已经被弃用,但是一些多线程框架还是在使用,因此多了解一下没有坏处。

    4、通过handle实现

    //handle去执行 Handler handler=new Handler(Looper.myLooper()); handler.post(new Runnable() { @Override public void run() { Log.d("MainActivity","handler is running"); } });

    1 2 3 4 5 6 7 8 9 handle一般用于主线程中,主线程调用handle,子线程负责处理请求数据,然后更新ui

    5、通过IntentService实现 class TaskIntentService extends IntentService{

    /** * @param name * @deprecated */ public TaskIntentService(String name) { super(name); } @Override protected void onHandleIntent(@Nullable Intent intent) { //处理任务 for (int i= 0;i<100;i++) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } sendProgress(i, 100); } Log.d("MainActivity","onHandleIntent"); } private void sendProgress(int currentProgress,int totalProgress) { //得到处理后的通知可以用广播去通知 Intent intent = new Intent(); intent.setAction("xxxxxxx"); intent.putExtra("current", currentProgress); intent.putExtra("total", totalProgress); sendBroadcast(intent); } }

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 IntentService这个在当前中也被谷歌弃用了,这是一个服务,在执行任务结束后服务生命周期就会结束(可查看源码,当onHandleIntent结束时就会调用终止函数),因此不适合去处理一些需要持续记录数据的操作

    总结 看了前面这么多种安卓内置的多线程操作后,感兴趣的也可以去研究一下框架Rxjava,在线程中处理还算是可以的。创作不易,请勿下次一定。

    Processed: 0.017, SQL: 9