HarmonyOS鸿蒙Next中Web的onInterceptRequest()方法如何异步返回

HarmonyOS鸿蒙Next中Web的onInterceptRequest()方法如何异步返回 目前需要拦截特定协议的资源,然后从服务器下载,再返回给Web,这是一个异步的过程,但onInterceptRequest()方法只接受同步返回WebResourceResponse,我应该如何处理?

3 回复

先设置setResponseIsReady为false,那么内核此时不会去读取response的内容。当获取到fd后(数据准备好后)再将其改为true,此时内核才会去读去响应数据.

build() {
  Column() {
    Web({ src: $rawfile('catch.html'), controller: this.webviewController })
      .onInterceptRequest((event) => {
        if (event) {
          console.log('url123456:' + event.request.getRequestUrl())
        }
        const url = event!.request.getRequestUrl();
        console.log(url.endsWith(".jpg") + '123456')
        if (!url.endsWith(".jpg")) return null;
        try {
          let url2='https://img.tukuppt.com/photo-big/17/12/16/57/94/171216579483.jpg';
          this.xxxx(url2).then(fd => {
            this.responseweb.setResponseData(fd);
            this.responseweb.setResponseCode(200);
            this.responseweb.setReasonMessage('OK');
            this.responseweb.setResponseIsReady(true);
            console.log(fd+" 1234567")
          });
          this.responseweb.setResponseMimeType('image/*');
          this.responseweb.setResponseIsReady(false);
          console.log(this.responseweb.getResponseData().toString+"123456")
          return this.responseweb;

        } catch (error) {
          console.error(`[Demo]Code: ${error.code},Message: ${error.message} `);
          return null
        }

      })
  }
}

更多关于HarmonyOS鸿蒙Next中Web的onInterceptRequest()方法如何异步返回的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,onInterceptRequest()方法是用于拦截Web请求的。要实现异步返回,你可以使用HandlerTaskDispatcher来处理异步任务。具体步骤如下:

  1. 创建异步任务:在onInterceptRequest()方法中,创建一个异步任务来处理请求。可以使用TaskDispatcher来分发任务到异步线程。

  2. 返回响应:在异步任务中,处理完请求后,通过WebResourceResponse对象返回响应。使用HandlerTaskDispatcher将结果返回到主线程。

  3. 示例代码:

import web from '@ohos.web.webview';
import taskpool from '@ohos.taskpool';

class MyWebResourceInterceptor implements web.WebResourceInterceptor {
    async onInterceptRequest(request: web.WebResourceRequest): Promise<web.WebResourceResponse> {
        return await taskpool.execute(async () => {
            // 模拟异步处理
            await new Promise(resolve => setTimeout(resolve, 1000));
            return new web.WebResourceResponse('text/html', 'utf-8', new ArrayBuffer(0));
        });
    }
}

// 注册拦截器
web.WebviewController.setWebResourceInterceptor(new MyWebResourceInterceptor());

在这个示例中,taskpool.execute用于创建一个异步任务,模拟了1秒的延迟后返回一个空的WebResourceResponse对象。

在HarmonyOS鸿蒙Next中,onInterceptRequest()方法用于拦截Web请求。若需异步返回结果,可以使用HandlerAsyncTask等机制。具体步骤如下:

  1. 创建Handler:在主线程中创建Handler,用于处理异步任务完成后的事件。
  2. 异步任务:在onInterceptRequest()中启动异步任务,如使用ThreadAsyncTask执行耗时操作。
  3. 返回结果:异步任务完成后,通过Handler将结果返回给主线程,并调用WebResourceResponse相关方法处理响应。

示例代码:

Handler handler = new Handler(Looper.getMainLooper());

webView.setWebViewClient(new WebViewClient() {
    @Override
    public WebResourceResponse onInterceptRequest(WebView view, WebResourceRequest request) {
        new Thread(() -> {
            // 执行耗时操作
            WebResourceResponse response = ...;
            handler.post(() -> {
                // 返回响应
                view.loadUrl(response.getUrl());
            });
        }).start();
        return null; // 异步返回时先返回null
    }
});

此方法确保在异步操作完成后,再通过Handler将结果返回给主线程,实现异步处理。

回到顶部