AynsTask类。使用这个类可以为耗时程序开辟一个新线程进行处理,处理完时返回。
asysTask类主要用到的几个内部回调函数有:
onPostExecute(Result),0); font:normal normal normal 13px/14px monospace; font-weight:bold">doInBackground(Params...),0); font:normal normal normal 13px/14px monospace; font-weight:bold">onProgressUpdate(Progress...)
异步任务执行的步骤:
1>主线程调用AsynTask子类实例的execute()方法后,首先会调用onPreExecute()方法。onPreExecute()在主线程中运行,可以用来写一些开始提示代码。2>之后启动新线程,调用doInBackground()方法,进行异步数据处理。
3>处理完毕之后异步线程结束,在主线程中调用onPostExecute()方法。onPostExecute()可以进行一些结束提示处理。
补充:在doInBackground()方法异步处理的时候,如果希望通知主线程一些数据(如:处理进度)。这时,可以调用publishProgress()方法。这时,主线程会调用AsynTask子类的onProgressUpdate()方法进行处理。
3、各个函数间数据的传递
通过上面的调用关系,我们就可以大概看出一些数据传递关系。如下:
execute()向doInBackground()传递。
doInBackground()的返回值会传递给onPostExecute()。
publishProgress()向progressUpdate()传递。
AsyncTask<Params,Progress,Result>
要点:为了调用关系明确及安全,AsynTask类在继承时要传入3个泛型。第一个泛型对应execute()向doInBackground()的传递类型。第二个泛型对应doInBackground()的返回类型和传递给onPostExecute()的类型。第三个泛型对应publishProgress()向progressUpdate()传递的类型。
放在res目录下xml文件夹里
public class MainActivity extends ListActivity implements OnClickListener{ private TextView infoTv ; private ProgressBar bar ; XmlResourceParser xrp ; private ArrayAdapter<String> adapter ; private List<String> list = new ArrayList<String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { infoTv = (TextView) findViewById(R.id.info_tv) ; bar = (ProgressBar) findViewById(R.id.bar) ; findViewById(R.id.start_btn).setOnClickListener(this); } @Override public void onClick(View v) { //执行异步任务,一个AsyncTask对象只能执行一次 async.execute() ; } private AsyncTask<String,Integer,String> async = new AsyncTask<String,String>(){ //异步任务做初始化的方法,在执行异步任务时第一个执行,(主进程执行) @Override protected void onPreExecute() { super.onPreExecute(); xrp = getResources().getXml(R.xml.word) ; } //第二个被调用,(后台进程进行) @Override protected String doInBackground(String... params) { int tagFlag = 0;int count = 1; try { while(true){ tagFlag = xrp.next() ; if(tagFlag == XmlResourceParser.END_DOCUMENT)break ; if(tagFlag == XmlResourceParser.START_TAG){ if("words".equals(xrp.getName())){ count = Integer.parseInt(xrp.getAttributeValue(0)); }if("word".equals(xrp.getName())){ list.add(xrp.nextText()) ; this.publishProgress(bar.getProgress()+bar.getMax()/count); Thread.sleep(1000) ; } } } } catch (XmlPullParserException e) { e.printStackTrace(); return "Failed" ; } catch (IOException e) { e.printStackTrace(); return "Failed" ; } catch (InterruptedException e) { e.printStackTrace(); return "Failed" ; } return "ok"; } //该方法用来监控后台执行的进度(主线程执行) //在doInBackground方法中调用publishProgress后执行 @Override protected void onProgressUpdate(Integer... values) { bar.setProgress(values[0]); adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,list) ; setListAdapter(adapter); infoTv.setText("progress:"+values[0]); } //doInBackground的返回将作为参数传入,最后一个被执行,一般用来控制视图控件显示结果内容(主进程执行) @Override protected void onPostExecute(String result) { super.onPostExecute(result); infoTv.setText(result); } }; }原文链接:https://www.f2er.com/xml/300157.html