Android里超级好用的AsyncTask模版

多线程之 AsyncTask 使用详解和从源码中深入理解 AsyncTask 机制 前言 AsyncTask是Android提供的一个助手类,它对Thread和Handler进行了封装,方便我们使用; Android之所以提供AsyncTask这个类,就是为了方便我们在后台线程中执行操作,然后将结果发送给主线程,从而在主线程中进行UI更新等操作。在使用AsyncTask时,我们无需关注Thread和Handler,AsyncTask内部会对其进行管理,这样我们就只需要关注于我们的业务逻辑即可; 一、AsyncTask介绍和使用 1、AsyncTask介绍 AsyncTask有四个重要的 阅读详情

 

Android里的AsyncTask是一个很好用的异步加载数据的工具类,我们是可以定义一个抽象类,其继承于AsyncTask,可接收不同类型的参数。定义如下:

import android.annotation.WorkerThread;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.support.annotation.MainThread;
import android.util.Log;

import java.util.concurrent.Executor;

/**
 * {@link AsyncTask} that defaults to executing on its own single threaded Executor Service.
 *
 * @param <Params>   执行时需要的参数,传给doInBackground使用.
 * @param <Progress> the type of the progress units published during the background computation.
 * @param <Result>   doInBackground执行完后返回的数据类型,它会被系统作为参数传给        
 *                   onPostExecute。
 */
public abstract class AsyncDbTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> {
    private static final String TAG = "AsyncDbTask";
    private static final boolean DEBUG = true;

    private final Executor mExecutor;
    boolean mCalledExecuteOnDbThread;

    protected AsyncDbTask(Executor mExecutor) {
        this.mExecutor = mExecutor;
    }

    @SafeVarargs
    @MainThread
    public final void executeOnDbThread(Params... params) {
        mCalledExecuteOnDbThread = true;
        executeOnExecutor(mExecutor, params);
    }

    public abstract static class LoadSkywayClientDBTask<Params, Progress, Result> extends AsyncDbTask<Params, Progress, Result> {
        private final ContentResolver mContentResolver;
        private final Uri mUri;
        private final String[] mProjection;
        private final String mSelection;
        private final String[] mSelectionArgs;
        private final String mOrderBy;

        public LoadSkywayClientDBTask(Executor executor,
                                      ContentResolver contentResolver,
                                      Uri uri, String[] projection,
                                      String selection,
                                      String[] selectionArgs,
                                      String orderBy) {
            super(executor);
            mContentResolver = contentResolver;
            mUri = uri;
            mProjection = projection;
            mSelection = selection;
            mSelectionArgs = selectionArgs;
            mOrderBy = orderBy;
        }

        @Override
        public Result doInBackground(Params... params) {
            Log.d(TAG, "LoadSkywayClientDBTask's doInBackground called in " + Thread.currentThread().getName());
            if (!mCalledExecuteOnDbThread) {
                IllegalStateException e = new IllegalStateException(this + " should only be executed using executeOnDbThread, "
                        + "but it was called on thread "
                        + Thread.currentThread());
                Log.w(TAG, e);
            }

            if (isCancelled()) {
                // This is guaranteed to never call onPostExecute because the task is canceled.
                return null;
            }

            if (DEBUG) {
                Log.v(TAG, "Starting query for " + this);
            }

            try (Cursor c = mContentResolver.query(mUri, mProjection, mSelection, mSelectionArgs, mOrderBy)) {
                if (c != null && !isCancelled()) {
                    Result result = onQuery(c);
                    if (DEBUG) {
                        Log.v(TAG, "Finished query for " + this);
                    }
                    c.close();
                    return result;
                } else {
                    if (c == null) {
                        Log.e(TAG, "Unknown query error for " + this);
                    } else {
                        if (DEBUG) {
                            Log.d(TAG, "Canceled query for " + this);
                        }
                        c.close();
                    }
                    return null;
                }
            } catch (Exception e) {
                Log.d("wujiang", "doInBackground: error = " + e.getMessage());
            }

            return null;
        }

        /**
         * Return the result from the cursor.
         *
         * <p><b>Note</b> This is executed on the DB thread by {@link #doInBackground(Params...)}
         */
        @WorkerThread
        protected abstract Result onQuery(Cursor c);

        @Override
        public String toString() {
            return this.getClass().getName() + "(" + mUri + ")";
        }
    }
}

假如我现在有个需求,要从一个数据库中加载数据,这个数据库存储数据的字段有channelid、name、logoUrl等等,现在只想查找这三个字段的数据,然后放到一个HaspMap里。我们可以定义一个LoadChannelListTask类,其继承于AsyncDbTask.LoadSkywayClientDBTask。

public class LoadChannelListTask extends AsyncDbTask.LoadSkywayClientDBTask<Void, Void, HashMap<String, SkywayChannelEntity>> {
        protected LoadChannelListTask(Executor executor,
                                     ContentResolver contentResolver,
                                     Uri uri, String[] projection,
                                     String selection,
                                     String[] selectionArgs,
                                     String orderBy) {
            super(executor, contentResolver, uri, projection, selection, selectionArgs, orderBy);
        }

        @Override
        protected void onPostExecute(HashMap<String, SkywayChannelEntity> skywayChannelEntityHashMap) {
            Log.d("wujiang", "LoadChannelListTask's onPostExecute: call this fun in " + Thread.currentThread().getName());
            mSkywayChannelList.clear();

            if (skywayChannelEntityHashMap != null) {
                mSkywayChannelList.putAll(skywayChannelEntityHashMap);
            }

            /** 打印 **/
            /*Set<Map.Entry<String, SkywayChannelEntity>> setEntry = mSkywayChannelList.entrySet();
            Iterator<Map.Entry<String, SkywayChannelEntity>> iterator = setEntry.iterator();

            while (iterator.hasNext()) {
                Map.Entry<String, SkywayChannelEntity> entry = iterator.next();
                String channelId = entry.getKey();
                SkywayChannelEntity skywayChannelEntity = entry.getValue();

                Log.d("wujiang", "channelId = " + channelId);
                Log.d("wujiang", "channelName = " + skywayChannelEntity.getChannelName());
                Log.d("wujiang", "channelLogoUrl = " + skywayChannelEntity.getChannelLogoUrl());
            }*/
        }

        @Override
        protected HashMap<String, SkywayChannelEntity> onQuery(Cursor c) {
            HashMap<String, SkywayChannelEntity> hashMap = new HashMap();

            if (c != null) {
                //Log.d("wujiang", "onQuery: count = " + c.getCount());
                while (c.moveToNext()) {
                    if (isCancelled()) {
                        Log.d("wujiang", "LoadChannelListTask's onQuery: isCancelled ");
                        return hashMap;
                    }

                    String channelId = c.getString(c.getColumnIndex("channelid"));
                    String channelName = c.getString(c.getColumnIndex("name"));
                    String channelLogoUrl = c.getString(c.getColumnIndex("logoUrl"));

                    SkywayChannelEntity skywayChannelEntity = new SkywayChannelEntity();
                    skywayChannelEntity.setChannelId(channelId);
                    skywayChannelEntity.setChannelName(channelName);
                    skywayChannelEntity.setChannelLogoUrl(channelLogoUrl);

                    hashMap.put(channelName, skywayChannelEntity);
                }
            }

            if (hashMap == null) {
                Log.d("wujiang", "LoadChannelListTask's onQuery: hashMap = null ");
            }
            return hashMap;
        }
    }

SkywayChannelEntity.java如下:

public class SkywayChannelEntity {
    String channelId;
    String channelName;
    String channelLogoUrl;

    public SkywayChannelEntity() {

    }

    public SkywayChannelEntity(String channelId, String channelName, String channelLogoUrl) {
        this.channelId = channelId;
        this.channelName = channelName;
        this.channelLogoUrl = channelLogoUrl;
    }

    public String getChannelId() {
        return channelId;
    }

    public void setChannelId(String channelId) {
        this.channelId = channelId;
    }

    public String getChannelName() {
        return channelName;
    }

    public void setChannelName(String channelName) {
        this.channelName = channelName;
    }

    public String getChannelLogoUrl() {
        return channelLogoUrl;
    }

    public void setChannelLogoUrl(String channelLogoUrl) {
        this.channelLogoUrl = channelLogoUrl;
    }
}

AsyncDbTask.LoadSkywayClientDBTask<Void, Void, HashMap<String, SkywayChannelEntity>>里,第一个Void表示不需要任何参数,第二个Void表示不需要显示进度,HashMap<String, SkywayChannelEntity>表示doInBackground的返回类型,即onPostExecute形参类型。这里没有实现doInBackground方法,是因为我们这里查询时没有设置一些特定的过滤条件(稍后会介绍设置过滤条件的例子),那执行时就调用了父类的doInBackground。

那怎么使用LoadChannelListTask呢?代码如下:

private ExecutorService DB_EXECUTOR = Executors.newSingleThreadExecutor(new NamedThreadFactory("query-skywayclient-db"));

private static final String[] SKYWAY_CHANNEL_LIST_PROJECTION = {
            "channelid",
            "name",
            "logoUrl"
    };

public void loadChannelListFromSkywayClient() {
        Log.d("wujiang", "loadChannelListFromSkywayClient: call this fun in " + Thread.currentThread().getName());
        LoadChannelListTask loadChannelListTask = new LoadChannelListTask(DB_EXECUTOR,
                mContext.getContentResolver(),
                SkyWayClientUtils.CHANNELLIST_URI,
                SKYWAY_CHANNEL_LIST_PROJECTION,
                null, null, null);
        loadChannelListTask.executeOnDbThread();
    }

SkyWayClientUtils.CHANNELLIST_URI为数据库的URI,不用多说;SKYWAY_CHANNEL_LIST_PROJECTION就是要查询的字段。这样执行完成后,数据就保存到了mSkywayChannelList里。

OK,我们继续。

假如有个数据库,里面存储了很多EPG的数据,多的时候几万条。何为EPG?简单点说,就是指的一个电视台的时刻表,即几点到几点播放什么内容,比如CCTV1 19:00-19:30播放新闻联播,19:30-20:30播放动物世界,CCTV5 19:00-19:30 播放什么,19:30-20:00播放什么,等等。那么我们数据库里可能就存储了很多台从今天开始的7天内的EPG信息。现在有需求,需要查询一些指定台指定时间范围内的EPG数据,如我想查找CCTV1、CCTV3、CCTV5、深圳卫视,湖南卫视等诸多台今天的EPG信息。我这里就定义了一个类:LoadChannelProgramsTask。

private HashMap<Integer, ArrayList<SkywayProgramEntity>> mChannelsProgramMap;

public class LoadChannelProgramsTask extends AsyncDbTask.LoadSkywayClientDBTask<QueryParams, Void, Boolean> {
        protected LoadChannelProgramsTask(Executor executor,
                                          ContentResolver contentResolver,
                                          Uri uri, String[] projection,
                                          String selection,
                                          String[] selectionArgs,
                                          String orderBy) {
            super(executor, contentResolver, uri, projection, selection, selectionArgs, orderBy);
        }

        @Override
        protected Boolean onQuery(Cursor c) {
            return true;
        }

        @Override
        public Boolean doInBackground(QueryParams... queryParams) {
            boolean ret = false;
            long load_db_start_time = System.currentTimeMillis();
            int startTime = queryParams[0].getStartTime();
            int endTime = queryParams[0].getEndTime();
            ArrayList<Integer> channelIdList = queryParams[0].getQueryChannels();

            //Log.d("wujiang", "LoadChannelProgramsTask's doInBackground: thread name = " + Thread.currentThread().getName());
            //Log.d("wujiang", "LoadChannelProgramsTask's doInBackground: startTime = " + startTime);
            //Log.d("wujiang", "LoadChannelProgramsTask's doInBackground: endTime = " + endTime);

            for (Integer channel_lcn : channelIdList) {
                ArrayList<SkywayProgramEntity> programArrayList = queryOneChannelPrograms(channel_lcn, startTime, endTime);
                Log.d("wujiang", "LoadChannelProgramsTask's doInBackground: channel lcn = " + channel_lcn);
                Log.d("wujiang", "LoadChannelProgramsTask's doInBackground: programArrayList = " + programArrayList.size());
                mChannelsProgramMap.remove(channel_lcn);
                mChannelsProgramMap.put(channel_lcn.intValue(), programArrayList);

                if (programArrayList.size() > 0) {
                    ret = true;
                }
            }

            Log.d(TAG, "doInBackground: spend time = " + (System.currentTimeMillis() - load_db_start_time));
            return ret;
        }

        @Override
        protected void onPostExecute(Boolean retValue) {
            //Log.d("wujiang", "LoadChannelProgramsTask's onPostExecute: thread name = " + Thread.currentThread().getName());
            Log.d("wujiang", "LoadChannelProgramsTask's onPostExecute: retValue = " + retValue);
            if (!retValue) {
                Log.d("wujiang", "LoadChannelProgramsTask's onPostExecute: 没有查询到数据,不需要更新UI");
                return;
            }

            for (QueryFinishListener listener : mListenerList) {
                listener.queryFinishCallback();
            }
        }
    }

 /**
     * 查询节目从startTime开始的epg信息
     * @param channel_lcn
     * @param startTime 单位秒
     * @param endTime   单位秒
     * @return
     */
    private ArrayList<SkywayProgramEntity> queryOneChannelPrograms(int channel_lcn, int startTime, int endTime) {
        ArrayList<SkywayProgramEntity> programsList = new ArrayList<>();
        programsList.clear();

        SkywayProgramEntity lastReadProgram = null;
        Cursor cursor = null;

        try {
            cursor = mContext.getContentResolver().query(
                    SkyWayClientUtils.CHANNEL_EPG_URI,
                    null,
                    SkywayProgramEntity.LCN_FILED + "=? and " + SkywayProgramEntity.STARTTIME_INTEGER_FILED + ">=?",
                    new String[]{String.valueOf(channel_lcn), String.valueOf(startTime)},
                    SkywayProgramEntity.STARTTIME_INTEGER_FILED);

            if (cursor != null && cursor.getCount() > 0) {
                Log.d("wujiang", "queryOneChannelPrograms: channel_lcn = " + channel_lcn);
                Log.d("wujiang", "queryOneChannelPrograms: cursor.getCount() = " + cursor.getCount());
                cursor.moveToFirst();

                while(!cursor.isAfterLast()) {
                    // to do your things

                    cursor.moveToNext();
                }
            }
        } finally {
            try {
                if (null != cursor && !cursor.isClosed()) {
                    cursor.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }


        return programsList;
    }

public class QueryParams {
        private int startTime;
        private int endTime;
        private ArrayList<Integer> queryChannels;

        public QueryParams(int startTime, int endTime, ArrayList<Integer> queryChannels) {
            this.startTime = startTime;
            this.endTime = endTime;
            this.queryChannels = queryChannels;
        }

        public int getStartTime() {
            return startTime;
        }

        public int getEndTime() {
            return endTime;
        }

        public ArrayList<Integer> getQueryChannels() {
            return queryChannels;
        }
    }

这里查询数据库时指定了条件,startTime表示EPG开始时间,endTime表示EPG的结束时间,queryChannels表示要查询的节目。所以AsyncDbTask.LoadSkywayClientDBTask<QueryParams, Void, Boolean>的第一个参数就表示过滤的参数,第三个参数表示有没有查询到数据。和第一个例子不同,这里实现了doInBackground,那是因为我们需要接收QueryParams参数。执行完成后查询到的EPG数据就保存在了mChannelsProgramMap里。

怎么使用LoadChannelProgramsTask?代码如下:

    /**
     *
     * @param startTime 秒单位
     * @param endTime   秒单位
     * @param queryLcnArrayList
     */
    public void loadProgramOfChannelsFromSkywayClient(int startTime, int endTime, ArrayList<Integer> queryLcnArrayList) {
        QueryParams queryParams = new QueryParams(startTime, endTime, queryLcnArrayList);
        LoadChannelProgramsTask loadChannelProgramsTask = new LoadChannelProgramsTask(DB_EXECUTOR,
                mContext.getContentResolver(),
                SkyWayClientUtils.CHANNEL_EPG_URI, null, null, null, null);
        loadChannelProgramsTask.executeOnDbThread(queryParams);
    }

到此就介绍完了,感觉怎么样呢?需要您的评价,谢谢!

 

                                                                                                                             THE               END

 

 

 

C++实现复制粘贴文本功能 要实现这个功能,我们需要使用操作系统提供的函数来操作剪贴板。在Windows操作系统中,我们可以使用Windows API函数来访问剪贴板。总结起来,使用C++实现复制和粘贴文本功能涉及使用操作系统提供的API函数来操作剪贴板。在本篇文章中,我将向您展示如何使用C++编程语言实现复制和粘贴文本的功能。我们将使用操作系统提供的API来进行剪贴板操作,并编写相应的代码来完成这个任务。如果您使用的是Linux操作系统,您需要使用适当的库和函数来访问剪贴板。函数中,我们首先将一个字符串复制到剪贴板中,然后使用。 阅读详情

相关推荐

STM32—时钟树(结合系统时钟函数理解)

时钟树的概念: 我们可以把MCU的运行比作人体的运行一样,人最重要的是什么?是心跳! 心脏的周期性收缩将血液泵向身体各处。心脏对于人体好比时钟对于MCU,微控制器(MCU)的运行要靠周期性的时钟脉冲来驱动,而这个脉冲的始源往往是由外部晶体振荡器提供时钟输入,最终转换为多个外部设备的周期性运作。这种时钟“能量”的传递路径犹如大树的养分由主干流向个分支,因此称为时钟树。 STM32时钟: 在STM32...

肥宅快乐博客 1万+

Android AsyncTask(线程间通信)

1.AsyncTask 在Android中我们可以通过Thread+Handler实现多线程通信,一种经典的使用场景是:在新线程中进行耗时操作,当任务完成后通过Handler向主线程发送Message,这样主线程的Handler在收到该Message之后就可以进行更新UI的操作。上述场景中需要分别在Thread和Handler中编写代码逻辑,为了使得代码更加统一,我们可以使用AsyncTask类。 AsyncTask是Android提供的一个助手类,它对Thread和Handler进行了封装,方便我们使用。

zenmela2011的专栏 6742

Allegro规则管理器实战:5步搞定Xnet等长组设置(含Relative Propagation Delay配置)

本文详细介绍了在Cadence Allegro规则管理器中,通过5个实战步骤高效设置Xnet等长组的方法。核心内容包括创建Xnet属性、定义引脚对、建立匹配组,并重点讲解了Relative Propagation Delay规则的配置与应用,帮助PCB设计师确保高速信号时序对齐,提升系统稳定性与性能。

weixin_29193259的博客 518

走过路过不要错过AsyncTask详解

  概念 AsyncTask:异步任务,从字面上来说,就是在我们的UI主线程运行的时候,异步的完成一些操作。AsyncTask允许我们的执行一个异步的任务在后台。我们可以将耗时的操作放在异步任务当中来执行,并随时将任务执行的结果返回给我们的UI线程来更新我们的UI控件。通过AsyncTask我们可以轻松的解决多线程之间的通信问题。 怎么来理解AsyncTask呢?通俗一点来说,AsyncTa...

林一末的博客 2602

语言随机效应模型_线性混合效应模型 VS 方差分析

线性混合效应模型相比方差分析具有很多优点。为了让大家更直观的了解,我们来做一下两者的对比。基于模拟的方法,生成了以下数据dat_sim:这种数据格式是长格式,也就是从实验软件导出来的那种数据格式。这种数据格式可以直接使用线性混合效应模型进行分析。该实验设计是被试内项目间的单因素两水平设计。category是自变量,两个水平分别是outgroup和ingroup,outgroup比ingr...

weixin_31960565的博客 2688

【数据分析/商业分析】面试题整理——SQL专题

数据分析\商业分析—面试题整理 自己总结的SQL类的面试题 文章目录数据分析\商业分析—面试题整理1.新增用户2.活跃用户数量3.连续登录4.次(n)日留存5.每个科目下分数最高的两名学生

awater_17的博客 1859

AsyncTask详解

在Android中有多种实现多线程的方式,比如AsyncTask、HandlerThread、IntentService等,其实从本质上讲,它们都是对传统线程Thread的封装。AsyncTask是一种轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和结果传递给主线程并在主线程中更新UI。从实现上讲,AsyncTask封装了Thread和Handler,通过AsyncTask可以更加方便地执行后台任务以及在主线程中访问UI,但是AsyncTask并不适合进行特别耗时的后台任务,对特别耗时的

chengjiamei的专栏 1882

Office如何通过VSTO进行WORD插件开发?

VSTO(Visual Studio Tools for Office )是VBA的替代,是一套用于创建自定义Office应用程序的Visual Studio工具包。VSTO可以用Visual Basic 或者Visual C#扩展Office应用程序(例如Word、Excel、PPT)。本文通过VSTO进行Word插件开发总结,并进行记录。

【cacrle】的博客 7322

详细讲解AsyncTask使用说明(值得收藏)

AsyncTask允许我们的执行一个异步的任务在后台。这里判断AsyncTask是否已经取消,如果不取消就执行我们的onPostExecute(),最后将状态设置为FINISHED,整一个AsyncTask的方法都执行完了,我们只需要继承AsyncTask实现其中的方法就可以按分析的顺序往下执行了。result.mTask也就是AsyncTask,最后调用result.mTask.finish(result.mData[0]),即AsyncTask的finish()方法,我们跟踪到finish()方法。

chinaherolts2008的博客 1290

SAP 批次管理

批次管理: 业务场景: 批次常用于:采购、生产、SD等: 1、先进先出,先入库的先出库(如何实现),基于入库时间来自动确定出库策略。 2、追塑:基于批次进行产品质量追溯 例如订单MTO ---> PP ----> MM(批次关联)。SO—>PP工单 --> 预留 --> 发料(基于批次A\B\C)-->产成品入库-->批次入库D--> ...

willieyuan的博客 1万+

Hyperledger Fabric 网络搭建详解

写在前面:博主也是因为一些原因刚刚入坑区块链,我认为在我们入门新技术的时候,入门总是最困难的部分,只要入门了,后面学习起来就会越来越轻松,在网上找了很多文章,我觉得大多条理不是很清楚。本文章会详细介绍fabric(v1.0)环境部署,以及在搭建过程我遇到一些问题及解决方案,希望可以帮助到你们。 博主环境机器:VMware15 Ubuntu16.04 fabric(v1.0)环境部署一、必备软件安装1.ubuntu环境安装2.Go语言3.Docker安装4. Docker-Compose 安装二、Fa.

林中有神君 1万+

Android AsyncTask 深度解析

params)返回的结果,参数类型由AsyncTask类上的第三个泛型限定;onPreExecute()和onPostExecute()方法都执行在主线程,onProgressUpdate()能够更改UI(更改进度条进度)必然也是主线程。这个小demo通过求1-10的和,在doInBackground()方法中通过延时的方式模拟了耗时操作,简单的演示了AsyncTask的使用。doInBackground()方法执行在线程池某一线程中,(看过源码后得到的结果,通过Log可以知道该方法没有执行在主线程中)

2501_90389522的博客 1582

电能质量仿真:电能质量改善措施仿真_(12).电能质量改善措施综合仿真案例

假设我们有一个微电网系统,该系统包含分布式电源(如光伏板、风力发电机)、储能设备、负荷和电网连接。电压波动:由于负荷的波动和分布式电源的间歇性输出,系统电压出现了不稳定的情况。谐波污染:非线性负荷和逆变器的运行导致系统中出现了显著的谐波污染。频率偏差:分布式电源的波动和负荷的突变导致系统频率出现了偏差。我们需要通过仿真来评估这些问题的影响,并提出相应的改善措施。

2401_87715305的博客 1360

Android AsyncTask 详解

将复杂工作异步化、线程化对于Android 的性能的提高起到了很重要的作用,Android 框架为开发提供了很多辅助程序,这一篇着重分析Android AsyncTask的原理。

私房菜 6810

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Android里用AsyncTask后的接口回调

前言AsyncTask,即异步任务,是Android给我们提供的一个处理异步任务的类.通过此类,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程。Asyn...

Vaccae的博客 333

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android AsyncTask源码解析

最后小编想说:不论以后选择什么方向发展,目前重要的是把Android方面的技术学好,毕竟其实对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!这里附上我整理的几十套腾讯、字节跳动,京东,小米,头条、阿里、美团等公司19年的Android面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。由于篇幅有限,这里以图片的形式给大家展示一小部分。

2401_86353930的博客 2229

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

安卓AsyncTask

参考:https://www.jianshu.com/p/ee1342fcf5e7 AsyncTask挺好用,能解决一大堆问题。 下面是总结的使用步骤: 1自定义类继承AsyncTask,里面分别传入三个参数,传入的参数、进度类型、返回的结果类型 2重写继承的相关方法,在相关方法中执行耗时操作和更新ui处理结果的操作 下面是转载的: 前言 多线程的应用在...

博客 572

安卓的异步任务AsyncTask

第二个泛型用来限制onProgressUpdate(Progress)和publishProgress(Progress)方法传入参数的类型,在publishProgress方法中传入的参数会在onProgressUpdate回调方法中被使用。第一个泛型用来限制execute(Params)和doInBackground(Params)方法传入参数的类型,在execute方法中传入的参数会在doInBackground回调方法中被使用。广泛地讲异步任务就是以多线程的方式完成的功能需求,相对于同步。

weixin_71792169的博客 736

Android AsyncTask 源码解析

一个接着一个的执行,相当于单线程。22行:将我们传入的参数赋值给了mWorker.mParams ,mWorker为一个Callable的子类,且在内部的call()方法中,调用了doInBackground(mParams),然后得到的返回值作为postResult的参数进行执行;看到这里,大家可能会认为,背后原来有一个线程池,且最大支持128的线程并发,加上长度为10的阻塞队列,可能会觉得就是在快速调用138个以内的AsyncTask子类的execute方法不会出现问题,而大于138则会抛出异常。

2401_89790938的博客 991

【安卓学习积累】AsyncTask的源码分析

在记录本文之前有参考下面大神的文章,本文也加入了一些自己的见解。旨在记录和学习一些Android知识。欢迎大家一起来讨论。 别再傻傻得认为AsyncTask只可以在主线程中创建实例和调用execute方法 一、抛出几个问题 1.AsyncTask是否只能在主线程中创建并执行呢? 2.AsyncTask中的onPreExecute()、doInBackground(String... par...

xiangzaixiansheng的博客 219

Android中AsyncTask的基本用法

Android中AsyncTask的基本用法

Android应用开发工程师 1239

Android之AsyncTask的用法

为什么要使用AsyncTask? 在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。在单线程模型中始终要记住两条法则: 1. 不要阻塞UI线程 2. 确保只在UI线程中访问Android UI工具包 当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理

文忠专栏 1万+

DeepTutor 快速上手:自托管 AI 学习助手完整指南

同一个问题问通用聊天机器人,得到的是一篇教科书式长文,它翻都不翻你给它的教材。DeepTutor 是另一类东西:一款自托管、Agent 原生的 AI 学习助手,对话、解题、出题、深度研究全部跑在同一个 Agent 循环上,数据默认留在本地机器。下面按真实使用顺序走一遍,从装好到问出第一句话,再到喂资料、出卷子。 ## 安装并初始化:pip 与 deeptutor init 搞定端口和模型 先让

gitblog_00905的博客 989

Android_AsyncTask

一.AsyncTask的简介         在Android中实现异步任务机制有两种方式,Handler和AsyncTask。 Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。关于Handler的相关知识

GitHubClub 5960

【安卓笔记】AsyncTask

简介: AsyncTask是android提供的一个处理异步任务的框架,相当于Handler+Thread。相比而言,AsyncTask的优点是封装良好,代码简洁。 使用AsyncTask可以使你在后台执行耗时任务(doInBackground)并将结果反馈给UI线程(onPostExecute),方便UI线程更新界面,而不会阻塞UI线程。 文档中说AsyncTask只适合执行短时任

RowandJJ 2272

Android 异步操作AsyncTask

3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params…onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread.onPreExecute() ----》doInBackground()------》onPostExecute()基本流程方法都游走一边。

2401_89689665的博客 968
上一篇: Android高效的EPG界面实现方式
下一篇: 判断网络是否真的连通的方法
wujiang_android
博客等级 码龄9年 11粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值