异步任务
一.宗旨:不能写内部类
二.AsyncTask实现网络下载数据,构造传参数
(1)布局文件:activity和item布局省略:
(2)适配器代码:省略:
(3)activity代码:MainActivity.java代码
public class Main2Activity extends AppCompatActivity {
private ArrayList<Bean.DataBean> list = new ArrayList<>();//这里创建集合
private ListView lv;
private MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
myAdapter=new MyAdapter(this,list);//这里创建适配器
lv.setAdapter(myAdapter);
new MyTask(lv,list,myAdapter).execute("http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&page=1");
}
}
(4)AsyncTask代码:自定义类继承AsyncTask,构造传参数
public class MyTask extends AsyncTask<String,String,String> {
private ListView listView;
private ArrayList list;
private MyAdapter myAdapter;
public MyTask(ListView listView, ArrayList list, MyAdapter myAdapter) {
this.listView = listView;
this.list = list;
this.myAdapter = myAdapter;
}
@Override
protected String doInBackground(String... strings) {
//网络请求数据
StringBuffer sb=new StringBuffer();
HttpURLConnection connection=null;
InputStream inputStream=null;
try {
URL url=new URL(strings[0]);
connection = (HttpURLConnection) url.openConnection();
connection.setReadTimeout(5*1000);
connection.setConnectTimeout(5*1000);
if(connection.getResponseCode()==200){
inputStream = connection.getInputStream();
byte[] b=new byte[1024];
int len=0;
while((len=inputStream.read(b))!=-1){
sb.append(new String(b,0,len));
}
}
} catch (IOException e) {
e.printStackTrace();
}finally{//最后关流
if(inputStream!=null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(connection!=null){
connection.disconnect();
}
}
return sb.toString();
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Gson gson=new Gson();
Bean bean=gson.fromJson(s,Bean.class);
list.addAll(bean.getData());
myAdapter.notifyDataSetChanged();
}
}
三.Thread+Handler+接口回调实现网络下载数据
(1)布局文件:activity和item布局省略:
(2)适配器代码:省略:
(3)自定义类继承Thread
//步骤1:自定义类继承Thread
public class MyThread extends Thread {
private MyHandler myHandler;
public MyThread(MyHandler myHandler) {
this.myHandler = myHandler;
}
@Override
public void run() {
super.run();
//网络请求数据
StringBuffer sb=new StringBuffer();
HttpURLConnection connection=null;
InputStream inputStream=null;
try {
URL url=new URL("http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&page=1");
connection = (HttpURLConnection) url.openConnection();
connection.setReadTimeout(5*1000);
connection.setConnectTimeout(5*1000);
if(connection.getResponseCode()==200){
inputStream = connection.getInputStream();
byte[] b=new byte[1024];
int len=0;
while((len=inputStream.read(b))!=-1){
sb.append(new String(b,0,len));
}
//handler发送
Message message=new Message();
message.obj=sb.toString();
myHandler.sendMessage(message);
}
} catch (IOException e) {
e.printStackTrace();
}finally{//最后关流
if(inputStream!=null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(connection!=null){
connection.disconnect();
}
}
}
}
(4)自定义类继承Handler并使用接口回调
//步骤2:自定义类继承Handler,定义接口
public class MyHandler extends Handler{
private MyCallBack callBack;
public MyHandler(MyCallBack callback) {
this.callBack=callback;
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
String json= (String) msg.obj;
//将json串回调回去
callBack.onCallBack(json);
}
//回调用的接口
interface MyCallBack{
public void onCallBack(String json);
}
}
(5)activity代码:MainActivity.java代码
//步骤3:实现MyCallBack接口
public class Main3Activity extends AppCompatActivity implements MyHandler.MyCallBack {
private ArrayList<Bean.DataBean> list = new ArrayList<>();//这里创建集合
private ListView lv;
private MyAdapter myAdapter;
private MyHandler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
myAdapter=new MyAdapter(this,list);//这里创建适配器
lv.setAdapter(myAdapter);
handler=new MyHandler(this);
new MyThread(handler).start();
}
//回调接口中的方法
@Override
public void onCallBack(String json) {
Gson gson=new Gson();
Bean bean=gson.fromJson(json,Bean.class);
list.addAll(bean.getData());
myAdapter.notifyDataSetChanged();
}
}