一、 子线程发给主线程
1.首先自定义一个线程类
class Load extends Thread{
@Override
public void run() {
super.run();
try {
URL url=new URL("https://www.apiopen.top/satinApi?type=1&page=2");
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
if(connection.getResponseCode()==200){
InputStream is = connection.getInputStream();
int len=0;
byte[] bys=new byte[1024];
StringBuffer buffer=new StringBuffer();
while ((len=is.read(bys))!=-1){
buffer.append(new String(bys,0,len));
}
Message message=new Message();
message.obj=buffer.toString();
//下载完成发送给主线程
handler.sendMessage(message);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
};
2.主线程接收,及对原生解析的理解
@SuppressLint("HandlerLeak")
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 使用原生解析,不用写JavaBean,直接get获取Json数据中的属性
// JSONObject:这个可以get对象的属性
// JSONArray:这个是存对象的数组:每个对象都由JSONObject代替
//如果多个线程给主线程发送可以通过what来判断哪个线程发过来的消息
if(msg.what==1){
//数据源
datas=new ArrayList<>();
try {
JSONObject obj1=new JSONObject(msg.obj.toString());
//这是返回的一个数组,数组存着这些对象
JSONArray data = obj1.getJSONArray("data");
for(int i=0;i<data.length();i++){
//数组中对象的Json串
String s = data.get(i).toString();
//在次对这个串解析获得每一个对象
JSONObject obj2=new JSONObject(s);
String text = obj2.getString("text");
String bimageuri = obj2.getString("bimageuri");
datas.add(new Info(text,bimageuri));
}
} catch (JSONException e) {
//这个异常是针对Json格式错误的异常
e.printStackTrace();
}
}
}
};
二、 主线程通知子线程
1.Runnable重写要实现一个方法
Handler handler;
int[] imgs=new int[]{R.mipmap.t1,R.mipmap.t2,R.mipmap.t3};
int count=0;
Runnable runnable=new Runnable() {
@Override
public void run() {
if(count>=imgs.length){
Intent intent=new Intent(Main2Activity.this,MainActivity.class);
startActivity(intent);
return;
}
imageView.setImageResource(imgs[count]);
count++;
handler.postDelayed(runnable,1000);
}
};
2.主线程中调用
handler.postDelayed(runnable,1000);