Asynctask获取网络数据使用

原创 2016年05月30日 21:19:46

主界面代码如下,仅仅为了记录Asynctask的使用。业务代码写在Activity里面肯定不好的。最好使用MVP模式来实现。

publicclass MainActivity extendsActivity {
    privatestatic String url = "http://www.imooc.com/api/teacher?type=2&num=100";
    privateListView myListView;
 
    @Override
    protectedvoid onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myListView = (ListView) findViewById(R.id.myListView);
        newMyAsynctask().execute(url);
    }
 
    /**
     * 实现网络的异步访问
     *
     * @author Administrator
     *
     */
    classMyAsynctask extendsAsyncTask<String, Void, List<NewsBean>> {
 
        @Override
        protectedList<NewsBean> doInBackground(String... params) {
            returngetNetWorkDatas(params[0]);
        }
 
        @Override
        protectedvoid onPostExecute(List<NewsBean> result) {
            super.onPostExecute(result);
            NewsAdapter adapter = newNewsAdapter(result,
                    getApplicationContext());
            myListView.setAdapter(adapter);
        }
 
    }
    /**
     * 获取制定的 json 数据转换成我们需要的 NewsBean 对象
     *
     * @param url
     * @return
     */
 
    publicList<NewsBean> getNetWorkDatas(String url) {
        List<NewsBean> myList = newArrayList<>();
        try{
            String jsonString = getJsonString(newURL(url).openStream());
            Log.i("sdaf", jsonString.toString());
            JSONObject jsonObject;
            jsonObject = newJSONObject(jsonString);
            JSONArray array = jsonObject.getJSONArray("data");
            for(inti = 0; i < array.length(); i++) {
                NewsBean bean = newNewsBean();
                JSONObject obj = array.getJSONObject(i);
                bean.image_icon = obj.getString("picSmall");
                bean.title = obj.getString("name");
                bean.content = obj.getString("description");
                myList.add(bean);
            }
        }catch(MalformedURLException e) {
            e.printStackTrace();
        }catch(IOException e) {
            e.printStackTrace();
        }catch(JSONException e) {
            e.printStackTrace();
        }
        returnmyList;
    }
 
    /**
     * 获取返回的String 数据
     *
     * @param is
     * @return
     */
    publicString getJsonString(InputStream is) {
        String result = "";
        InputStreamReader isr;
        try{
            String line = "";
            isr = newInputStreamReader(is, "UTF-8");
            BufferedReader br = newBufferedReader(isr);
            while((line = br.readLine()) != null) {
                result += line;
            }
        }catch(UnsupportedEncodingException e1) {
            e1.printStackTrace();
        }catch(IOException e) {
            e.printStackTrace();
        }
        returnresult;
    }
}


适配器代码如下,可以参考开源的一些全能适配器。

publicclassNewsAdapter extendsBaseAdapter {
    privateList<NewsBean> datas;
    privateContext context;
 
    publicNewsAdapter(List<NewsBean> datas, Context context) {
        super();
        this.datas = datas;
        this.context = context;
    }
 
    @Override
    publicintgetCount() {
        returndatas.size();
    }
 
    @Override
    publicObject getItem(intposition) {
        returndatas.get(position);
    }
 
    @Override
    publiclonggetItemId(intposition) {
        returnposition;
    }
 
    @Override
    publicView getView(intposition, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if(convertView == null) {
            viewHolder = newViewHolder();
            convertView = LayoutInflater.from(context).inflate(
                    R.layout.item_class,null);
            viewHolder.title = (TextView) convertView
                    .findViewById(R.id.tv_title);
            viewHolder.content = (TextView) convertView
                    .findViewById(R.id.tv_content);
            viewHolder.iv_icon = (ImageView) convertView
                    .findViewById(R.id.iv_icon);
            convertView.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder) convertView.getTag();
        }
        NewsBean bean = datas.get(position);
        viewHolder.iv_icon.setImageResource(R.drawable.ic_launcher);
        String url = bean.image_icon;
        viewHolder.iv_icon.setTag(url);
        // new ImageLoader().showImageByThread(viewHolder.iv_icon,
        // bean.image_icon);
        newImageLoader().showImageByAsyncTask(viewHolder.iv_icon, url);
        viewHolder.title.setText(bean.title);
        viewHolder.content.setText(bean.content);
 
        returnconvertView;
    }
 
    classViewHolder {
        publicTextView title;
        publicTextView content;
        publicImageView iv_icon;
    }
 
}

ImageLoader代码如下,可以参考其他开源库(Glide Picasso Fresco)

publicclassImageLoader {
    privateString murl;
    privateImageView imageview;
    privateHandler handler = newHandler() {
        publicvoidhandleMessage(android.os.Message msg) {
            super.handleMessage(msg);
            if(imageview.getTag().equals(murl)) {
                imageview.setImageBitmap((Bitmap) msg.obj);
            }
        };
    };
 
    publicvoidshowImageByThread(ImageView imageView, finalString url) {
        imageview = imageView;
        murl = url;
        newThread() {
            @Override
            publicvoidrun() {
                super.run();
                Bitmap bitmap = getBitMapByUrl(url);
                Message msg = Message.obtain();
                msg.obj = bitmap;
                handler.sendMessage(msg);
            };
        }.start();
    }
 
    publicBitmap getBitMapByUrl(String url) {
        Bitmap bitmap;
        InputStream is = null;
        try{
            URL ul = newURL(url);
            HttpURLConnection connection = (HttpURLConnection) ul
                    .openConnection();
            is = newBufferedInputStream(connection.getInputStream());
            bitmap = BitmapFactory.decodeStream(is);
            connection.disconnect();
            Thread.sleep(1000);
            returnbitmap;
        }catch(MalformedURLException e) {
            e.printStackTrace();
        }catch(IOException e) {
            e.printStackTrace();
        }catch(InterruptedException e) {
            e.printStackTrace();
        }finally{
            try{
                is.close();
            }catch(IOException e) {
                e.printStackTrace();
            }
        }
        returnnull;
    }
 
    publicvoidshowImageByAsyncTask(ImageView imageView, String url) {
        newNewsAsyncTask(imageView,url).execute(url);
    }
 
    privateclassNewsAsyncTask extendsAsyncTask<String, Void, Bitmap> {
        privateImageView mimageview;
        privateString mUrl;
        publicNewsAsyncTask(ImageView imageview,String url) {
            mimageview = imageview;
            mUrl= url;
        }
 
        @Override
        protectedBitmap doInBackground(String... arg0) {
 
            returngetBitMapByUrl(arg0[0]);
        }
 
        @Override
        protectedvoidonPostExecute(Bitmap result) {
            super.onPostExecute(result);
            if(mimageview.getTag().equals(mUrl)) {
                mimageview .setImageBitmap(result);
            }
        }
    }
}



publicclassNewsBean {
    publicString title;
    publicString content;
    publicString image_icon;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

(原创)使用AsyncTask(带修改线程池方式)+自定义ImageLoader+LRU算法对图片三级缓存及其显示优化(只有在ListView滑动停止的时候才去网络请求获取图片数据)

前言: 以前看了些关于图片优化处理缓存比较全的视频(感谢慕风网),现在回顾觉得还是挺好的也就总结出来下,感觉针对图片做处理这块还真的用的比较多,本文章只要使用异步线程AsyncTask、ImageLo...

异步任务加载网络数据——AsyncTask使用

AsyncTask类简单介绍 Android从1.5开始引入了AsyncTask这个类,AsyncTask内部使用Java 1.5的并发库比普通初级Android开发者编写的Thread+Handle...

android开发异步加载网络数据AsyncTask的使用

一、异步任务加载网络数据: 在android中提供了一个异步任务的类AsyncTask,简单来说,这个类中的任务是运行在后台线程中的,并可以将结果放到UI线程中进行处理,它定义了三种 泛型,分别是...

【Android学习笔记系列】AsyncTask的使用和介绍(获取网络图片与进度条实例)

什么是异步 首先我们要先知道什么是异步、什么是同步: 同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程,同步是阻塞模式。 异步交互:指发送一个请求,不需要等待返回,随时可...

AsyncTask简单获取网络图片

  • 2015-09-10 13:03
  • 5.52MB
  • 下载

AsyncTask异步加载以及Proxy代理模式访问网络数据

1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(...

【Android学习笔记系列】AsyncTask、BaseAdapter整合异步加载用例(通过解析JSON格式数据加载网络图片内容)

什么是异步加载 异步加载就是用异步的方式去加载数据,也就是用非主线程去加载数据的意思 为什么要异步加载 原因大概有两个: 第一、  为了提高用户体验,让用户加载数据的时候不会感到明显的卡顿...

Android之从网络上获取图片的两种方式讲解:thread+handle和AsyncTask方式

从网络上获取图片是一个比较耗时的操作,放在主线程会导致阻塞主线程,响应超时,所以我们不能把它放在主线程里操作,必须放在一个子线程里,我打算采用两种方式去实现。1、采用thread去获取图片,获取到后通...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)