加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

用异步任务实现解析XML

发布时间:2020-12-15 23:37:10 所属栏目:百科 来源:网络整理
导读:AynsTask类。使用这个类可以为耗时程序开辟一个新线程进行处理,处理完时返回。 asysTask类主要用到的几个内部回调函数有: onPreExecute() , onPostExecute(Result) ,0); font:normal normal normal 13px/14px monospace; font-weight:bold">doInBackground

AynsTask类。使用这个类可以为耗时程序开辟一个新线程进行处理,处理完时返回。

asysTask类主要用到的几个内部回调函数有:

onPreExecute(),

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()传递的类型。


XML文件如上一篇文章:word.xml

放在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); 
		}
	};
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读