向webview注入网络上的js,就需要请求js的url。但不允许在主线程直接发http请求,需要开子线程,开了子线程后,子线程就自己运行,主线程也自己运行,但是我的主线程需要子线程的结果才能继续往下操作,不然没有意义。我这个不适合网络请求回调,如下是一种简单的解决方式。

就是把请求结果绑定到成员变量。然后检查成员变量。这样就不会造成子线程还没运行完,就迅速获取js的内容,导致是空的,向注入webview注入js失败,。

package com.xx.view;

import java.util.concurrent.TimeUnit;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response; /**
* Created by wj49476 on 2018/3/23.
*/ public class ScriptDownloader { private static final String urlPrefix = "http://10.0.4.147:8301/jss/crawl/";
private String scriptName;
private byte[] jsScriptContent;
private int times = 0; public ScriptDownloader(String scriptNmae){
this.scriptName = scriptNmae;
} private void get() {
final String url = urlPrefix + scriptName;
new Thread(new Runnable() {
@Override
public void run() {
final Request.Builder builder = new Request.Builder();
final OkHttpClient client = new OkHttpClient.Builder()
.readTimeout(30, TimeUnit.SECONDS)
.connectTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.build(); //设置各种超时时间
builder.url(url);
System.out.println("请求的js脚本url是:" + url);
final Request request = builder.build();
try (Response response = client.newCall(request).execute()) {
jsScriptContent = (response.body().bytes());
System.out.println(new String(jsScriptContent));
}catch (Exception e){
System.out.println("请求脚本出错");
e.printStackTrace();
}
}
}).start();
} public byte[] getJsScriptContent(){ if (times % 5 == 0){
get();
}
times += 1;
try{
Thread.sleep(1000);
}catch (Exception e){
e.printStackTrace();
} if (jsScriptContent != null){
return jsScriptContent;
}else{
if (times < 20){
return getJsScriptContent();
}
else{
return null;
}
}
}
public static void main(String[] args) {
byte[] jsConet = new ScriptDownloader("credit/crccReport.js").getJsScriptContent();
System.out.println("注入的脚本内容是: " + new String(jsConet));
}
}

安卓不让做阻塞的io网络请求,但没说不让sleep。

安卓webview子线程网络请求,怎么获得结果?的更多相关文章

  1. GCD-两个网络请求同步问题

    在网络请求的时候有时有这种需求 两个接口请求数据,然后我们才能做最后的数据处理.但是因为网络请求是移步的 .我们并不知道什么时候两个请求完成 . 通常面对这样的需求会自然的想到 多线程 啊 .表现真正 ...

  2. Volley Post网络请求

    /*post请求*/public void dostringVolleypost(){ /*第一步,创建请求队列*/ queue = Volley.newRequestQueue(this); /*第 ...

  3. Volley Get网络请求

    public class VolleyActivity extends AppCompatActivity { WebView webView; Button button; RequestQueue ...

  4. Cocos2d-X多线程(4) 在子线程中进行网络请求

    新版本的android系统已经不允许在UI线程中进行网络请求了,必须新建一个线程. 代码实操: 头文件: #ifndef __TestThreadHttp_SCENE_H__ #define __Te ...

  5. 【安卓网络请求开源框架Volley源码解析系列】定制自己的Request请求及Volley框架源码剖析

    通过前面的学习我们已经掌握了Volley的基本用法,没看过的建议大家先去阅读我的博文[安卓网络请求开源框架Volley源码解析系列]初识Volley及其基本用法.如StringRequest用来请求一 ...

  6. 【安卓网络请求开源框架Volley源码解析系列】初识Volley及其基本用法

    在安卓中当涉及到网络请求时,我们通常使用的是HttpUrlConnection与HttpClient这两个类,网络请求一般是比较耗时,因此我们通常会在一个线程中来使用,但是在线程中使用这两个类时就要考 ...

  7. 网络请求怎么样和UI线程交互? Activity2怎么通知Activity1 更新数据

    1.网络请求怎么样和UI线程交互? 目前我的做法是,建立线程池管理网络请求线程,通过添加task来新增网络请求.所有的网络操作通过统一的request来实现,网络返回结果通过回调onError和onS ...

  8. 安卓网络请求之——OkHttp学习

    之前做安卓项目的时候,HTTP请求用的是android api中的HttpURLConnection和HttpClient,编码比较繁琐,自己封装的也不好.后来知道有很多网络请求的第三方框架,可以方便 ...

  9. 线程安全-一个VC下多个网络请求

    一.线程安全变量控制显示隐藏loading框 问题描写叙述: 同一页面有两个异步网络请求,第一个请求開始,loading旋转.第二个请求開始loading旋转.第一个结束,loading停止旋转,但是 ...

随机推荐

  1. Java 源码赏析 - java.lang - Void

    被人鄙视了,于是也来读读源码... package java.lang; /** * The Void class is an uninstantiable placeholder class to ...

  2. WinForm 控件键盘消息处理剖析(转)

    一直想整理键盘事件的调用顺序,刚好看见园子里的这篇文章,写的不错,就转载了:http://www.cnblogs.com/tedzhao/archive/2010/09/07/1820557.html ...

  3. 【C】——可变参数

    写代码之前要先介绍一下可变参数的备用知识: C函数要在程序中用到以下这些宏: void va_start( va_list arg_ptr, prev_param ); type va_arg( va ...

  4. NetBeans Lookups Explained!

    https://dzone.com/articles/netbeans-lookups-explained —————————————————————————————————————————————— ...

  5. .gitignore不生效解决办法

    .gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的.那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提 ...

  6. A SIMPLE LIBRARY TO BUILD A DEEP ZOOM IMAGE

    My current project requires a lot of work with Deep Zoom images. We recently received some very high ...

  7. 关于Unity中场景的导入与导出(专题九)

    Unity场景 场景虽然是由场景美术做好的,但是我们经常需要自己去导导出以及从别的项目导入,所以我们需要对场景的导入和导出有一个详细的了解 1: 场景是由美术人员搭建完成后提交给程序;2: 场景一般包 ...

  8. android读取大图片并缓存

    最近开发电视版的云存储应用,要求”我的相册“模块有全屏预览图片的功能,全屏分辨率是1920*1080超清.UI组件方面采用Gallery+ImageSwitcher组合,这里略过,详情参见google ...

  9. Pandas 读取文本格式数据

    title 其实书中说的我认为不够全,因为公司里面现在主要用stata和spss,暂时还没有用到sas,excel也很少用 那么读取文件的方式,因为有人已经总结了,我就偷过来算了 对应不同的文件类型有 ...

  10. e858. 将键盘键和事件绑定

    This example creates a number of keystrokes and adds them to the input map of a component. When a ke ...