慕课网: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
原创粉丝点击