慕课网:Android异步加载AsyncTask项目实战上
来源:互联网 发布:linux 下启动smb服务 编辑:程序博客网 时间:2024/05/30 04:49
今天,在慕课网上看到Android异步加载的视频,感觉那个老师讲的挺6的。决定学习一下,整理下笔记。
为什么要使用异步加载:
1.还是Android单线程模型
2.耗时操作阻塞UI线程
异步加载最常用的两种方式:
1.多线程\线程池
2.AsyncTask
这里通过一个小小的Demo逐步实现新闻列表:
item_layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="5dp" > <ImageView android:id="@+id/iv_icon" android:layout_width="64dp" android:layout_height="64dp" android:src="@drawable/ic_launcher" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" > <TextView android:id="@+id/tv_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Title" android:textSize="15sp" /> <TextView android:id="@+id/tv_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Content" android:textSize="10sp" /> </LinearLayout></LinearLayout>
NewsBean.java
package com.xbmu.news;public class NewsBean {public String newsImgae;public String newsTitle;public String newsContent;}
MainActivity.java
package com.xbmu.news;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import java.net.MalformedURLException;import java.net.URL;import java.util.ArrayList;import java.util.List;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import android.app.Activity;import android.os.AsyncTask;import android.os.Bundle;import android.util.Log;import android.widget.ListView;public class MainActivity extends Activity {private ListView mListView;private static String URL = "http://www.imooc.com/api/teacher?type=4&num=30";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mListView = (ListView) findViewById(R.id.listview);new NewsAsyncTask().execute(URL);}/** * 将URL对应得json格式数据转化为我们所封装的NewsBean * @param url * @return */public List<NewsBean> getJsonData(String url) {List<NewsBean> newsBeansList = new ArrayList<NewsBean>();try {/** * new URL(url).openStream() * 此句功能与url.openConnection().getInputStream()相同 * 可根据URL直接联网获取数据,简单粗暴! * 返回值类型是InputStream */String jsonData = readStream(new URL(url).openStream());Log.d("btt", jsonData);JSONObject jsonObject;NewsBean newsBean;try {jsonObject = new JSONObject(jsonData);JSONArray jsonArray = jsonObject.getJSONArray("data");for (int i = 0; i < jsonArray.length(); i++) {jsonObject = jsonArray.getJSONObject(i);newsBean = new NewsBean();newsBean.newsTitle = jsonObject.optString("name");newsBean.newsContent = jsonObject.optString("description");newsBean.newsImgae = jsonObject.optString("picSmall");newsBeansList.add(newsBean);}} catch (JSONException e) {e.printStackTrace();}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}System.out.println(newsBeansList.size());return newsBeansList;}/** * 通过字节流is解析网页返回的数据 * @param is * @return */private String readStream(InputStream is) {InputStreamReader isr ;String result = "";try {String line = "";isr = new InputStreamReader(is,"utf-8");//将字节流转换成字符流BufferedReader br = new BufferedReader(isr);//字符缓冲流while((line=br.readLine())!=null){result += line;}} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return result;}/** * 实现网络的异步访问 * @author bitaotao */class NewsAsyncTask extends AsyncTask<String, Void, List<NewsBean>>{@Overrideprotected List<NewsBean> doInBackground(String... params) {return getJsonData(params[0]);//params[0]请求的网络地址}@Overrideprotected void onPostExecute(List<NewsBean> newsBean) {super.onPostExecute(newsBean);NewsAdapter adapter = new NewsAdapter(MainActivity.this, newsBean);mListView.setAdapter(adapter);}}}NewsAdapter.java
package com.xbmu.news;import java.util.List;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;public class NewsAdapter extends BaseAdapter {private List<NewsBean> mList;//填充的数据private LayoutInflater mInflater;//布局public NewsAdapter(Context context,List<NewsBean> data){mList = data;mInflater = LayoutInflater.from(context);}@Overridepublic int getCount() {return mList.size();}@Overridepublic Object getItem(int position) {return mList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder = null;if(convertView == null){viewHolder = new ViewHolder();convertView = mInflater.inflate(R.layout.item_layout, null);viewHolder.ivIcon = (ImageView) convertView.findViewById(R.id.iv_icon);viewHolder.tvTitle = (TextView) convertView.findViewById(R.id.tv_title);viewHolder.tvContent = (TextView) convertView.findViewById(R.id.tv_content);convertView.setTag(viewHolder);}else{viewHolder = (ViewHolder) convertView.getTag();}viewHolder.ivIcon.setImageResource(R.drawable.ic_launcher);//先设置图片为默认本地图片viewHolder.tvTitle.setText(mList.get(position).newsTitle);viewHolder.tvContent.setText(mList.get(position).newsContent);return convertView;}class ViewHolder{public TextView tvTitle,tvContent;public ImageView ivIcon;}}以上代码就通过使用异步加载获取到了网络的数据,非常简单,这里我们把图片设置为本地默认的了,后面会完善该项目。
0 0
- 慕课网:Android异步加载AsyncTask项目实战上
- 慕课网:Android异步加载AsyncTask项目实战中
- Android AsyncTask异步加载
- Android 异步加载图片-AsyncTask
- Android 异步加载图片-AsyncTask
- Android--AsyncTask异步加载详解
- Android 异步加载数据 AsyncTask
- android 异步加载解决方案 AsyncTask
- Android异步加载AsyncTask详解
- Android之AsyncTask异步加载
- Android异步加载AsyncTask详解
- Android中AsyncTask异步加载
- Android异步加载AsyncTask详解
- Android异步加载之AsyncTask
- (Android实战)ProgressBar+AsyncTask实现界面数据异步加载(含效果图)
- (Android实战)ProgressBar+AsyncTask实现界面数据异步加载(含效果图)
- (Android实战)ProgressBar+AsyncTask实现界面数据异步加载(含效果图)
- Android项目实战-ListView异步图片加载及压缩缓存
- css3动画效果
- OSG教程:场景保存类Viewer
- 代码规范检查工具——checkStyle
- Android学习(四)
- mysql控制台常用命令大全
- 慕课网:Android异步加载AsyncTask项目实战上
- GPFS在Linux下安装过程简述
- MINA 源码分析笔记
- 一个对象的toString()
- mySQl常用命令
- iOS 9 Afnetworking 3.0 Request failed: unacceptable content-type: text/plain
- C#类型转换总结(二)之数据类型转换的几种形式
- 使用服务帐户访问AdWords API集成KeyMob手机聚合平台
- 太原UI设计师郭文军讲解UI设计中质感的画法及应用