Backlight87
9/13/2017 - 3:03 PM

AsyncTask使用demo

AsyncTask使用demo异步执行任务使用

/**
 * 加载文件的异步任务。
 */  
public class LoadFilesTask extends AsyncTask<String, String, Boolean> {

    private Context mContext;
    
    public LoadFileTask(Context context) {
        mContext = context;
    }

    @Override
    public void onPreExecute() {
        // 在异步任务开始前提示用户。
        Toast.makeText(mContext, "开始加载文件", Toast.LENGTH_SHORT).show();
    }
    
    @Override
    public Boolean doInBackground(String... params) {
        String file1 = params[0];
        String file2 = params[1];
        String file3 = params[2];
        
        boolean isSuccess = true;
        
        // 加载第一个文件,并且通知用户当前加载的文件名称。
        publishProgress("File1");
        isSuccess = isSuccess && loadFile(file1);
        
        // 加载第二个文件,并且通知用户当前加载的文件名称。
        publishProgress("File2");
        isSuccess = isSuccess && loadFile(file2);
        
        // 加载第三个文件,并且通知用户当前加载的文件名称。
        publishProgress("File3");
        isSuccess = isSuccess && loadFile(file3);
        
        // 返回文件加载结果。
        return isSuccess;
    }
    
    @Override
    public void onProgressUpdate(String... values) {
        // 提示用户当前在加载的是哪个文件。
        String fileName = values[0];
        String message = "正在加载文件:" + fileName;
        Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
    }
    
    @Override
    public void onPostExecute(Boolean result) {
        // 在异步任务结束的时候根据不同的加载结果提示用户。
        boolean isSuccess = result;
        if (isSuccess) {
            Toast.makeText(mContext, "成功加载所有文件", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(mContext, "加载文件失败", Toast.LENGTH_SHORT).show();      
        }
    }
    
}


注意:new出来这个对象后,
使用有两种

对象.executeOnExecutor(Executor, Params...)
使用我们自定义的线程池异步执行
或者
对象.execute()
使用async自带的线程池(不过注意里是默认是串行执行的,你new再多对象也是一个一个执行,想要并行执行就用第一个方法我们自己创建的线程池)