AsyncTask<String, Void, Integer>

AsyncTask可以使得使用UI线程变的更容易更适当,它可以在后台运行一些操作然后在UI上展现,不用操作具体的线程和handlers
一个 asynchronoustask包括三种基本类型(调用参数,进度和结果),和四个步骤(调用开始,在后台运行,处理进度,结束)
), 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{
    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 { ... }
 
四个步骤的说明
onPreExecute():
在task被执行之后,立刻调用

doInBackground(Params...):
onPreExecute执行完毕后,执行该方法,参数传到了这个方法中,执行完毕后必须返回一个值,还可以使用publishProgress(Progress...)发布进度到onProgressUpdate(Progress...),便于更新进度

onProgressUpdate(Progress...):
publishProgress(Progress...)被调用后,就执行该方法,显示进度信息
通常是显示一个进度条,或在text域里显示日志信息

onPostExecute(Result)
当doInBackground(Params...)执行完毕后即执行该方法

手机实名制OCR功能中的实例
例子一
定义
class OcrTask extends AsyncTask
{
 @Override
 protected OcrMessage doInBackground(String...arg0) 
 {
  ApplyServiceservice  = newApplyService(getApplicationContext());
  returnservice.ocrTest(save_file_path);
 }
 @Override
   protected voidonPostExecute(OcrMessage result)
   {
   returnImageScan(result);
   }
}

调用
OcrTask ocr = new OcrTask();
ocr.execute(save_file_path);


例子二
保存图片任务,参数是byte数组,是图片对应的byte数组
class SavePhotoTask extends AsyncTask 
{
     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 {
   FileOutputStreamfos =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 voidonPostExecute(Integer result)
   {
   call_OCR();
   }
}

调用
SavePhotoTask savePhotoTask = new SavePhotoTask();
savePhotoTask.execute(data);

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
package com.hmongsoft.merchant.Module.dataSource.onLine.V20230707; import android.os.AsyncTask; import com.hmongsoft.merchant.Base.Interface.ActionCallbackValue; import com.hmongsoft.merchant.Base.config.SysConfig; import java.io.IOException; import okhttp3.MultipartBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; /** * 校验商铺名称是否存在 */ public class JudgeMerchantIsExist { public JudgeMerchantIsExist(String merchantName, ActionCallbackValue<String,Boolean> actionCallback) { SignInTask signInTask=new SignInTask(merchantName,actionCallback); signInTask.execute(); } private static class SignInTask extends AsyncTask<String,Integer,Boolean>{ private String merchantName; private ActionCallbackValue<String,Boolean> actionCallback; private String requestResult; public SignInTask(String merchantName, ActionCallbackValue<String,Boolean> actionCallback) { this.merchantName =merchantName; this.actionCallback=actionCallback; } //异步前(UI) @Override protected void onPreExecute() { super.onPreExecute(); } //异步中(非UI) @Override protected Boolean doInBackground(String... strings) { OkHttpClient client = new OkHttpClient().newBuilder().build(); RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) .addFormDataPart("merchantName",merchantName) .build(); Request request = new Request.Builder() .url(SysConfig.MerchantPORT+"/MerchantController/judgeMerchantNameIsExist") .method("POST", body) .build(); try { requestResult = client.newCall(request).execute().body().string(); if (requestResult.equals("true")){ return true; }else { return false; } } catch (IOException e) { e.printStackTrace(); return false; } } //异步后(UI) @Override protected void onPostExecute(Boolean aBoolean) { super.onPostExecute(aBoolean); actionCallback.callback("result",aBoolean); } } } 这段代码的SignInTask已经被弃用,请帮换一个写法
07-08

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值