最近项目中频繁的使用Handler,把项目弄的特别臃肿,我认为不好,所以用了另一种异步操作的方法,那就是 AsyncTask!
使用AsyncTask优点 结构清晰,功能定义明确,对于对个后台执行任务简单,清晰.
使用AsyncTask缺点 在单个后台异步处理时,显得代码过多,结构过于复杂(个人认为,单个后台直接采用Handler,开线程才是王道)
介绍 Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理。 首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。
Android为了降低这个开发难度,提供了AsyncTask。AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务。
AsyncTask直接继承于Object类,位置为android.os.AsyncTask。要使用AsyncTask工作我们要提供三个泛型参数,并重载几个方法(至少重载一个)。 AsyncTask的三种泛型 ☆Params 启动任务执行的输入参数,比如HTTP请求的URL。 ☆Progress 后台任务执行的百分比。 ☆Result 后台执行任务最终返回的结果,比如String。
使用AsyncTask必须要重写这两个方法 doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里这里不能直接操作UI。在执行过程中可以调publicProgress(Progress…)来更新任务的进度。
onPostExecute(Result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回
有必要的话你还得重写以下这三个方法,但不是必须的:
onProgressUpdate(Progress…) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
onPreExecute() 这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。 onCancelled() 用户调用取消时,要做的操作
使用AsyncTask类要注意以下几点
Task的实例必须在UI thread中创建; execute方法必须在UI thread中调用; 不手动调用onPreExecute(), onPostExecute(Result),doInBackground(Params…), onProgressUpdate(Progress…)这几个方法; 该task只能被执行一次,否则多次调用时将会出现异常;
如果不是很理解的话,那只有 上…代码 了 请看一个很简单的例子 先是布局文件
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/swipe_container" android:layout_width="match_parent" android:layout_height="match_parent" > <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:layout_marginTop="70dp" android:layout_marginLeft="20dp" android:id="@+id/textView" android:text="案例" android:textSize="20dp" android:textStyle="bold" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </ScrollView> </android.support.v4.widget.SwipeRefreshLayout>然后是程序代码
public class MainActivity extends AppCompatActivity { private SwipeRefreshLayout swipeRefreshLayout; private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textView); swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container); swipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_light, android.R.color.holo_red_light, android.R.color.holo_orange_light, android.R.color.holo_green_light); swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { ProgressBarAsyncTask asyncTask = new ProgressBarAsyncTask(textView); asyncTask.execute(1000); } }); } class ProgressBarAsyncTask extends AsyncTask<Integer, Integer, String> { private TextView textView; public ProgressBarAsyncTask(TextView textView) { super(); this.textView = textView; } @Override protected void onPreExecute() { super.onPreExecute(); textView.setText("开始执行异步线程"); } @Override protected String doInBackground(Integer... params) { Operator netOperator = new Operator(); int i = 0; for (i = 0; i <= 5; i++) { netOperator.operator(); publishProgress(i); } return i + params[0].intValue() + ""; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); textView.setText("异步操作执行结束" + s); swipeRefreshLayout.setRefreshing(false); } } }一个睡眠的工具类
public class Operator { public void operator(){ try { //休眠1秒. Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }上效果图↓