AsyncTask官网API翻译

官方API翻译

AsyncTask使开发者可以更轻松的使用UI线程。这个类使开发者无需操作ThreadHandler便可执行后台操作并将结果返回到UI线程。
AsyncTask被设计为一个围绕ThreadHandler的辅助类,并且不构成通用线程框架。理论上AsyncTask应该被用于几秒钟的短作业,如果线程需要运行一段时间,强烈建议使用java.util.concurrent包下的ExcutorThreadPoolExecutorFutureTask
异步任务是指运行在后台线程,而结果需要返回到UI线程的计算过程。异步任务由三个泛型:ParamsProgressResult,以及四个步骤:调用onPreExecutedoInBackgroundonProgressUpdateonPostExecute组成。

用法

AsyncTask在使用前需要先被继承并覆盖doInBackground()等方法。通常还会覆盖onPostExecute()方法。
例如

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));
            // Escape early if cancel() is called
            if (isCancelled()) break;
        }
        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);

AsyncTask的泛型类型

异步任务用到的三种泛型类型如下:
1. Params任务执行时需要传递的参数的类型。
1. Progress后台运行期间返回的进度的类型。
1. Result后台运行的返回结果的类型。
这三个泛型并非都会被用到,用Void说明该泛型未被使用:

private class MyTask extends AsyncTask<Void, Void, Void> { ... }

四个步骤

每个异步任务的执行都需要经过4个步骤:
1. onPreExecute()后台任务执行前在UI线程上的回调。一般用于初始化task并在界面上显示进度条。
1. doInBackground()在后台线程被调用,在onPreExecute()执行完后立即执行。这一步被用来在后台执行耗时操作。异步任务的参数在这里被传递进来。运算处理的结果会在这一步返回给最后一步。可以在此方法中调用publishProgress()将进度返回给UI线程的onProgressUpdate()
1. onProgressUpdate()在调用publishProgress()之后被调用,运行在UI线程,其执行时间是不确定的。该方法用于后台任务运行时在用户界面显示进度。
1. onPostExecute()后台任务结束后被调用,执行在UI线程。后台任务的结果会在这里以参数形式传递进来。

取消任务

可以通过调用cancle()取消任务,之后如果调用isCancelled()时会返回true。如果调用了cancle(),在doInBackGround()之后会执行onCancelled()而不是onPostExcute()。为了保证task尽快被取消,应该适时的在odInBackGround()中调用isCancelled()来获取当然task状态。

线程规则

一下是使用本类时必须遵守的几个线程规则
- AsyncTask必须在UI线程中被加载。
- AsyncTask实例必须在UI线程中创建。
- execute()方法必须在UI线程中调用。
- 不能手动调用的方法:onPreExecute()onPostExecute()doInBackground()onProgressUpdate()
- 只能执行一次。(再次执行会抛异常)

可观察内存

AsyncTask保证所有回调都同步调用,因此下面的操作都是线程安全的。
- 在构造方法或onPreExecute()中给成员赋值,然后在doInBackGroudn()中使用。
- 在doInBackGround()中赋值,然后在onProgressUpdate()onPostExecute()`中使用。

执行顺序

期初,多个AsyncTask连续的在同一个后台线程执行。DONUT之后,多个AsyncTask在线程池的不同线程中并行执行。HONEYCOMB之后,多个task在同一个线程执行避免并行执行引发的应用错误。
如果确实需要并行执行,可以用’THREAD_POOL_EXECUTOR’调用executeOnExecutor(java.util.concurrent.Executor,Object[])

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以帮你提供一个使用百度翻译 APIAndroid 代码示例。在使用之前,请确保已经申请到了百度翻译 API 的密钥。 首先,在你的 Android 项目中,创建一个新的 Java 类,例如 `BaiduTranslateUtil`。然后在该类中添加以下代码: ```java import android.os.AsyncTask; import android.util.Log; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; public class BaiduTranslateUtil { private static final String API_URL = "https://fanyi-api.baidu.com/api/trans/vip/translate"; private static final String API_KEY = "YOUR_API_KEY"; private static final String API_SECRET = "YOUR_API_SECRET"; public interface TranslationCallback { void onTranslationComplete(String result); void onTranslationError(String errorMessage); } public static void translate(String text, String sourceLanguage, String targetLanguage, TranslationCallback callback) { String encodedText = URLEncoder.encode(text); String url = API_URL + "?q=" + encodedText + "&from=" + sourceLanguage + "&to=" + targetLanguage + "&appid=" + API_KEY + "&salt=123456&sign=" + generateSign(text); new TranslationTask(callback).execute(url); } private static String generateSign(String text) { String sign = API_KEY + text + "123456" + API_SECRET; sign = MD5Util.encode(sign); return sign; } private static class TranslationTask extends AsyncTask<String, Void, String> { private TranslationCallback callback; public TranslationTask(TranslationCallback callback) { this.callback = callback; } @Override protected String doInBackground(String... urls) { try { URL url = new URL(urls[0]); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.connect(); int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); return response.toString(); } else { return null; } } catch (Exception e) { e.printStackTrace(); return null; } } @Override protected void onPostExecute(String result) { if (result != null) { Log.d("Translation", result); callback.onTranslationComplete(result); } else { callback.onTranslationError("Translation error occurred."); } } } } ``` 在上述代码中,你需要将 `YOUR_API_KEY` 和 `YOUR_API_SECRET` 替换为你在百度翻译 API 平台上申请到的密钥。 接下来,你可以在你的 Activity 或 Fragment 中使用 `BaiduTranslateUtil` 类的 `translate` 方法来调用百度翻译 API。例如: ```java BaiduTranslateUtil.translate("Hello world!", "en", "zh", new BaiduTranslateUtil.TranslationCallback() { @Override public void onTranslationComplete(String result) { // 处理翻译结果 } @Override public void onTranslationError(String errorMessage) { // 处理翻译错误 } }); ``` 这个示例代码会将英文的 "Hello world!" 翻译中文。你可以根据自己的需求修改源语言和目标语言。 请注意,该示例代码仅提供了基本的使用方法,并未处理网络请求的线程问题。在实际开发中,你可能需要使用更合适的网络请求库来处理异步请求和错误处理。 希望这能帮到你!如果还有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值