您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
javase异步网络请求更新ui(完美亲测)
发布时间:2017-09-24 11:17:55编辑:雪饮阅读()
有这样的一个需求:
有一个宫格列表中的每个宫格单元的缩略图理应是网络请求之后才能有的。但是如果在swing中先请求网络,然后开始绘制则貌似会导致界面在网络请求未完成前是白茫茫一片。对于普通用户来说好像就是程序卡住了一样的感觉。就算界面出来了,但网络请求未完成时操作界面也是假死状态。用户点击界面直接无效(好像卡死,但没有出现“未响应”)。等网络请求之后才把点击效果呈现。
为了解决该问题,我使用这样的方法:
首先主线程负责绘制。
主线程绘制完成后再开一个线程负责网络请求,网络请求和更新宫格列表(这样就不会影响主线程用户操作了)。
核心代码:uiMain.java
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
uiMain thisClass = new uiMain();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
}
});
}
public uiMain() {
super();
Toolkit kit = Toolkit.getDefaultToolkit(); //定义工具包
Dimension screenSize = kit.getScreenSize(); //获取屏幕的尺寸
screenWidth = screenSize.width; //获取屏幕的宽
screenWidth=1904;
screenHeight=screenSize.height;//获取屏幕的高
contentHeight=(int)(screenSize.height*1.2);
initialize();
new Thread(new Runnable(){
@Override
public void run() {
//访问一个网络接口,并将接口信息遍历取出每条信息中的缩略图下载到本地
jsonData=HttpRequestUtil.httpRequest("http://localhost/", "POST", "");
for(JsonBean.DataBean.ListBean list: jsonData.getData().getListBean()){
String thumb=list.getThumb();
String timestr=list.getImputti()+".jpg";
//如果文件网址为空则不下载,直接加载本地图片
if(thumb==null||thumb.isEmpty()){}
else{
//如果下载成功
if(download(thumb,timestr)){}
}
}
//下载完毕后进行更新每个宫格单元中的默认缩略图
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
uiMain.getDUVCLHcenterDown.remove(get16Gongge);
get16Gongge(get16GonggeX, get16GonggeY, get16GonggeW, get16GonggeH, get16GonggeZW, get16GonggeZH, jsonData);
uiMain.getDUVCLHcenterDown.add(get16Gongge);
uiMain.getDUVCLHcenterDown.updateUI();
}
});
}
}).start();
}
注意事项:
ui更新操作不要以为直接覆盖原全局变量就了事了。
正确做法时先用原全局变量所表示的容器的父级将该容器从父级移除。
然后覆盖原全局变量,再然后用父级重新添加,添加后父级再updateUi()。
非冒泡向上级级更新也可以,只需要更新最内层容器的直接父级就能解决问题。
如我核心代码中:
//从父级remove要替换的容器
uiMain.getDUVCLHcenterDown.remove(get16Gongge);
//覆盖要替换容器所表示的全局变量
get16Gongge(get16GonggeX, get16GonggeY, get16GonggeW, get16GonggeH, get16GonggeZW, get16GonggeZH, jsonData);
//从父级add覆盖之后的全局变量
uiMain.getDUVCLHcenterDown.add(get16Gongge);
//从父级updateUI
uiMain.getDUVCLHcenterDown.updateUI();
关键字词:javase,异步,网络请求,更新ui