AsyncTask基础运用(请求网络)
来源:互联网 发布:在线数字抽奖软件 编辑:程序博客网 时间:2024/06/06 00:54
在Android中实现异步任务机制有两种方式,Handler和AsyncTask。
Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。
为了简化操作,Android1.5提供了工具类android.os.AsyncTask,它使创建异步任务变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务.
1.execute(Params… params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。
2.onPreExecute(),在execute(Params… params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记。
3.doInBackground(Params… params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress… values)来更新进度信息。
4.onProgressUpdate(Progress… values),在调用publishProgress(Progress… values)时,此方法被执行,直接将进度信息更新到UI组件上。
5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。
在使用的时候,有几点需要格外注意:
1.异步任务的实例必须在UI线程中创建。
2.execute(Params… params)方法必须在UI线程中调用。
3.不要手动调用onPreExecute(),doInBackground(Params… params),onProgressUpdate(Progress… values),onPostExecute(Result result)这几个方法。
4.不能在doInBackground(Params… params)中更改UI组件的信息。
5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。
AsyncTask请求网络
import android.graphics.Bitmap;import android.os.AsyncTask;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import com.google.gson.Gson;import java.util.ArrayList;import java.util.List;/** * ctrl+o 重写方法 */public class MainActivity extends AppCompatActivity { public String urlString = "http://api.expoon.com/AppNews/getNewsList/type/1/p/1"; String urlBitmap = "http://img.my.csdn.net/uploads/201407/26/1406383265_8550.jpg"; private ListView listView; ArrayList<Product.DataBean> dataBeanList = new ArrayList(); private MAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.lv); //直接调用asyncTask类请求网络,把url传进去 mAdapter = new MAdapter(); listView.setAdapter(mAdapter); //这行代码要在主线程调用; new MAsyncTask().execute(urlString); } /** * 泛型 第一个参数:传过来的url * 第二个参数 :进度 * 第三个参数 :接口请求成功返回的东西(json,bitmap) */ private class MAsyncTask extends AsyncTask<String, Void, String> { /** * 这个方法在子线程,在这个方法里进行联网操作 * * @param strings 可变参数,底层是数组,里面放的是传过来的参数; * @return */ @Override protected String doInBackground(String... strings) { String urlTemp = strings[0]; //直接用工具类获取json String netJson = NetUtil.getNetJson(urlTemp); return netJson; //返回给(前台方法,主线程方法onPostExecute) } /** * 这个方法在主线程, 直接更新ui即可; * * @param s s是doInBackground请求接口成功后返回的json */ @Override protected void onPostExecute(String s) { super.onPostExecute(s); Log.e("wzq", "onPostExecute: " + s); //解析s, 直接给控件展示; Gson gson = new Gson(); Product product = gson.fromJson(s, Product.class); //把一个集合的数据放入另一个集合 List<Product.DataBean> temp = product.getData(); dataBeanList.addAll(temp); mAdapter.notifyDataSetChanged(); } } private class MAdapter extends BaseAdapter { @Override public int getCount() { Log.e("wzq", "getCount:" + dataBeanList.size()); return dataBeanList.size(); } @Override public Object getItem(int i) { return dataBeanList.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { View view1 = View.inflate(MainActivity.this, R.layout.item02, null); TextView tv_name = view1.findViewById(R.id.tv_name); ImageView iv = view1.findViewById(R.id.iv); tv_name.setText(dataBeanList.get(i).getNews_summary());// iv.setImageBitmap("url"); new MBitMapAsyncTask(iv).execute(urlBitmap); Log.e("wzq", "getCount:" + "执行getview"); return view1; } } private class MBitMapAsyncTask extends AsyncTask<String,Void,Bitmap>{ private ImageView iv; public MBitMapAsyncTask(ImageView iv) { this.iv = iv; } @Override protected Bitmap doInBackground(String... strings) { return NetUtil.getNetBitmap(strings[0]); } @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); iv.setImageBitmap(bitmap); } }}
- AsyncTask基础运用(请求网络)
- AsyncTask请求网络
- AsyncTask网络请求数据
- 网络请求数据之AsyncTask
- 封装AsyncTask异步请求网络
- Android-网络请求数据AsyncTask
- Android使用AsyncTask异步请求网络
- OkHttp网络请求框架+AsyncTask自动解析
- 关于AsyncTask如何并发请求网络
- 网络请求基础
- android 使用AsyncTask代替thread进行网络请求
- 通过AsyncTask实现网络请求的方式,get和post
- listview+BaseAdapter + AsyncTask异步请求网络 + LruCache缓存图片
- 使用AsyncTask 实现网络请求及PullToRefreshListView下拉刷新
- URLConnection的post请求网络数据和AsyncTask异步线程
- AsyncTask+HttpUrlConnection网络请求解析XML且定位
- 【Android实战之旅 001】AsyncTask异步操作网络请求
- 通过AsyncTask实现网络请求的方式,get和post
- Hibernate注解 @Enumerated
- openwrt 编译内核模块中的配置问题
- 解决maven打包Mark invalid异常
- 递归---算法
- DirectX入门之快速开发框架
- AsyncTask基础运用(请求网络)
- android6.0以上模拟位置状态检测
- 表格标签
- 异常
- <p>标签为何不可以包含<div>标签
- Android App将数据写入内部存储和外部存储的示例
- oracle的基本术语
- Tomact端口被占用的解决方案
- 草稿一