android.os.AsyncTask<String, Void, Integer>
2012-08-25 19:48
337 查看
简介 AsyncTask可以使得使用UI线程变的更容易更适当,它可以在后台运行一些操作然后在UI上展现,不用操作具体的线程和handlers 一个 asynchronous task包括三种基本类型(调用参数,进度和结果),和四个步骤(调用开始,在后台运行,处理进度,结束) ), and most often will override a second one (onPostExecute(Result).) 使用方法描述 Asynchronous Task必须是作为一个子类来使用, task实例必须在UI线程创建 execute(Params...)必须在UI线程调用 不要手工调用onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...)。 task只可以execute一次,执行多次就报异常 一个例子 类的定义 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { protected Long doInBackground(URL... urls) { int count = urls.length; long totalSize = 0; for (int i = 0; i < count; i++) { totalSize += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count) * 100)); } return totalSize; } protected void onProgressUpdate(Integer... progress) { setProgressPercent(progress[0]); } protected void onPostExecute(Long result) { showDialog("Downloaded " + result + " bytes"); } } 类的使用 new DownloadFilesTask().execute(url1, url2, url3); 三种基本类型的说明 Params, 传给task的参数的类型 Progress, 表示进度单位的类型 Result, 返回类型 不是所有的task都需要定义类型,如果没有则使用void,如下所示 private class MyTask extends AsyncTask<Void, Void, Void> { ... } 四个步骤的说明 onPreExecute(): 在task被执行之后,立刻调用 doInBackground(Params...): onPreExecute执行完毕后,执行该方法,参数传到了这个方法中,执行完毕后必须返回一个值,还可以使用 publishProgress(Progress...) 发布进度到onProgressUpdate(Progress...),便于更新进度 onProgressUpdate(Progress...): publishProgress(Progress...)被调用后,就执行该方法,显示进度信息 通常是显示一个进度条,或在text域里显示日志信息 onPostExecute(Result) 当doInBackground(Params...)执行完毕后即执行该方法 手机实名制 OCR功能中的实例 例子一 定义 class OcrTask extends AsyncTask<String, Void, OcrMessage> { @Override protected OcrMessage doInBackground(String... arg0) { ApplyService service = new ApplyService(getApplicationContext()); return service.ocrTest(save_file_path); } @Override protected void onPostExecute(OcrMessage result) { returnImageScan(result); } } 调用 OcrTask ocr = new OcrTask(); ocr.execute(save_file_path); 例子二 保存图片任务,参数是byte数组,是图片对应的byte数组 class SavePhotoTask extends AsyncTask<byte[], Void, Integer> { String picname; @Override protected Integer doInBackground(byte[]... datas) { byte[] data = datas[0]; Bitmap bitmap; BitmapFactory.Options ops2 = new BitmapFactory.Options(); ops2.inSampleSize = 1; bitmap = BitmapFactory.decodeByteArray(data,0, data.length,ops2); try { FileOutputStream fos = OcrCameraActivity.this.openFileOutput("output.jpg",Activity.MODE_WORLD_READABLE); bitmap.compress(Bitmap.CompressFormat.JPEG, 80, fos); fos.flush(); fos.close(); save_file_path = "output.jpg"; }catch (Exception e) { e.printStackTrace(); } return 0; } @Override protected void onPostExecute(Integer result) { call_OCR(); } } 调用 SavePhotoTask savePhotoTask = new SavePhotoTask(); savePhotoTask.execute(data);
相关文章推荐
- android.os.AsyncTask<String, Void, Integer>
- android.os.AsyncTask<String, Void, Integer>
- 扫描SD卡异步任务new AsyncTask<Integer, Integer, String>()
- AsyncTask<String ,Integer,Integer>类中各个方法的执行先后顺序
- AsyncTask<String, Void, Integer>
- android关于HashMap<String, Integer>取最大的value,并找出key。
- android The method execute(Void[]) is ambiguous for the type new AsyncTask<Void,Void,Void>(){}
- Android利用SparseArray替换使用HashMap<Integer,E>
- android 解析 List<Map<String,String>>类型
- Android错误:方法setListAdapter(ArrayAdapter<String>) is undefined for the type String
- 如何在ArrayList<Integer>中添加String类型数据
- Android实现List<String>存储到SharedPreferences工具类
- String13 String12 Integer<->Roman Easy&Medium
- HashMap<String, ArrayList<Integer>>用法
- error C2664: 'void ATL::CStringT<BaseType,StringTraits>::Format (...)
- android 子线程通过bundle、handler.sendMessage(message)向主线程传输多个类型数据,包括list<Map<String,Object>>
- Android_ArrayList<Map<String, Object>>读+取数据_141012
- Android使用SharedPreferences保存HashSet<String>数据不能更新成功
- ArrayList<Integer> list = new ArrayList<Integer>();在这个泛型为 Integer 的 ArrayList 中存放一个 String 类型的对象。
- Android笔记—通过SharedPreferences将List<Map<String, String>>进行存储