用异步任务实现简单的新闻资讯
来源:互联网 发布:mac怎么创建网页 编辑:程序博客网 时间:2024/05/16 01:17
程序中用到的有接口回调,接口回调在开发中是很重要的,能解决很多问题,如果有不懂得,可以继续关注我的博客,部分博客中有我对于接口回调的理解,我会后续会写更多的博客,我的技术有限,所以代码都是以简单的为主,异步任务有不懂得,我的博客也有关于异步任务的一些介绍
值得注意的是:本程序的接口并没有写,读者可自己寻找适合的接口进行操作
新闻资讯的基本布局
<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="match_parent" android:orientation="vertical" tools:context="${packageName}.${activityClass}" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="新闻标题:" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="请点击:" /> <Spinner android:id="@+id/sp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@null" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="20dp" android:background="#00BFFF" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10px" android:text="新闻内容:" /> <TextView android:id="@+id/te" android:layout_width="wrap_content" android:layout_height="wrap_content" /></LinearLayout>
封装好的异步任务工具类
import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import javax.security.auth.PrivateCredentialPermission;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.widget.ImageView;public class PottingAsyncTask extends AsyncTask<String, Void, Object> { private OnDownLitener onDownLitener; private DownType downType; public PottingAsyncTask(DownType downType) { // TODO Auto-generated constructor stub this.downType = downType; } //子线程 @Override protected Object doInBackground(String... arg0) { // TODO Auto-generated method stub byte[] bs = getByteArray(arg0[0]); if (bs != null) { switch (downType) { case JSON: String json = new String(bs); if(onDownLitener!=null){ Object datasObject=onDownLitener.downJson(json); return datasObject; } break; case IMAGE: Bitmap bitmap = BitmapFactory.decodeByteArray(bs, 0, bs.length); return bitmap; default: break; } } return null; } //在执行完doInBackground后再执行onPostExecute @Override protected void onPostExecute(Object result) { switch (downType) { case JSON: if(onDownLitener!=null){ onDownLitener.paresJson(result); } break; case IMAGE: if(onDownLitener!=null){ onDownLitener.setImage(result); } break; default: break; } } //构建接口,使用接口回调的方式控制控件 public interface OnDownLitener{ Object downJson(String json);//用于下载json void paresJson(Object object);//用于解析json void setImage(Object object);//用于控制image控件 } //获得byte数组 private byte[] getByteArray(String urlString) { InputStream in = null; ByteArrayOutputStream ou = null; URL url; try { url = new URL(urlString); HttpURLConnection httpURLConnection = (HttpURLConnection) url .openConnection(); httpURLConnection.setRequestMethod("GET"); httpURLConnection.setReadTimeout(3000); httpURLConnection.connect(); if (httpURLConnection.getResponseCode() == 200) { in = httpURLConnection.getInputStream(); ou=new ByteArrayOutputStream(); byte[] buffer = new byte[1024 * 8]; int len = -1; while ((len = in.read(buffer)) != -1) { ou.write(buffer, 0, len); } return ou.toByteArray(); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (in != null) { try { in.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (ou != null) { try { ou.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return null; } //借助泛型,确定所需要的类型 public static enum DownType { JSON, IMAGE } //接口回调的方法 public PottingAsyncTask setOnDownLitener(OnDownLitener onDownLitener) { this.onDownLitener = onDownLitener; return this;//返回this的原因是链式编程,返回当前PottingAsyncTask的对象 }}
新闻资讯的主方法
import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import com.example.day06_04.PottingAsyncTask.DownType;import com.example.day06_04.PottingAsyncTask.OnDownLitener;import android.R.integer;import android.app.Activity;import android.graphics.Bitmap;import android.os.Bundle;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemSelectedListener;import android.widget.ArrayAdapter;import android.widget.ImageView;import android.widget.Spinner;import android.widget.TextView;public class MainActivity extends Activity { //需要自己填写自己所需要的新闻接口 String urlString=""; private Spinner spinner=null; private TextView textView=null; private ArrayAdapter<String> adapter=null; private List<Map<String, Object>> listmap=new ArrayList<Map<String,Object>>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView=(TextView) findViewById(R.id.te); spinner=(Spinner) findViewById(R.id.sp); spinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // 判断是否等于空的原因是因为网络加载时需要时间的,防止程序报错 if(listmap!=null){ String dString=(String) listmap.get(arg2).get("summary"); textView.setText(dString); } } @Override public void onNothingSelected(AdapterView<?> arg0) { } }); new PottingAsyncTask(DownType.JSON).setOnDownLitener(new OnDownLitener() { @Override public void paresJson(Object object) { // TODO Auto-generated method stub List<String> list =(List<String>) object; adapter=new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item,list); spinner.setAdapter(adapter); } @Override public Object downJson(String json) { // TODO Auto-generated method stub try { //不同的接口,获得不同的json,所以解析json的代码也是不一样的,可以仿造这部分的代码 List<String> list=new ArrayList<String>(); JSONObject jsonObject=new JSONObject(json); JSONArray jsonArray=jsonObject.getJSONArray("data"); for(int i=0;i<jsonArray.length();i++){ //利用Map原因是map可以存储更多类型的数据 Map<String, Object> map=new HashMap<String, Object>(); String title = jsonArray.getJSONObject(i).getString("title"); String summary = jsonArray.getJSONObject(i).getString("summary"); int len=i+1; list.add("【"+len+"】:"+title); map.put("title", title); map.put("summary", summary); listmap.add(map); } return list; } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } @Override public void setImage(Object object) { // TODO Auto-generated method stub } }).execute(urlString); }}
0 0
- 用异步任务实现简单的新闻资讯
- [新闻资讯] AS的异步执行
- Android编程基础之异步任务的简单实现
- linux 下实现简单的异步多线程任务分发
- 简单的异步任务AsyncTask
- Tornado异步任务的实现
- AsyncTask --异步任务+简单的网络图片下载
- 关于AsyncTask-异步任务的简单理解
- 异步任务AsyncTask的简单理解
- spring+ActiveMQ+JMS+线程池实现简单的分布式,多线程,多任务的异步任务处理系统
- spring+ActiveMQ+JMS+线程池实现简单的分布式,多线程,多任务的异步任务处理系统
- ActiveMQ(六):spring+ActiveMQ+线程池实现简单的分布式,多线程,多任务的异步任务处理系统
- 实现增强的异步任务执行组件
- 异步任务的实现之文件管理器
- Tornado异步任务的实现之一
- Android AsyncTask实现异步任务的执行
- 异步任务AsyncTask的实现原理
- Django基于celery的异步任务实现
- Linux基础知识
- OpenSSl
- 485. Max Consecutive Ones
- 第一次Linux作业
- 算法训练 数组查找及替换
- 用异步任务实现简单的新闻资讯
- Fork/Join初识
- TypeError: 'numpy.float64' object is not iterablex
- T-SQL语言分类
- Java8 新日期时间类(2)
- python实现半双工聊天
- BZOJ 1433 [ZJOI2009]假期的宿舍
- 数据结构:链表的增加、插入和删除
- 匈牙利算法 二分图的匹配问题