标签:
异步任务一般用在加载一些网络资源的时候用,主要的实现方法是新建一个类来继承AsyncTask这个父类,然后复写该类下面的一些方法,其中doInBackground方法是必须要的,下面看代码
package com.example.test; import android.os.AsyncTask; import android.widget.ProgressBar; import android.widget.TextView; public class ProgressBarAsyncTask extends AsyncTask<Integer, Integer, String> { private TextView textView; private ProgressBar progressBar; public ProgressBarAsyncTask(TextView textView, ProgressBar progressBar) { super(); this.textView = textView; this.progressBar = progressBar; } @Override protected void onPreExecute() {// in UI thread // TODO Auto-generated method stub super.onPreExecute(); textView.setText("onPreExecute开始运行"); } @Override protected String doInBackground(Integer... params) {// MainActivity传进来的参数 // TODO Auto-generated method stub NetOperatior netOperatior = new NetOperatior(); System.out.println("params" + params[0].intValue());// 测试传进来的值 int i; for (i = 10; i <= 100; i += 10) { netOperatior.operate();// current thread sleep 1s publishProgress(i);// 执行onProgressUpdate(Integer... values)方法 } return i + params[0].intValue() + ""; } @Override protected void onPostExecute(String result) {// 由doInBackground(Integer... // params)方法返回的值进行传递,在主UI线程中运行 // TODO Auto-generated method stub super.onPostExecute(result); textView.setText("the operation have done,the current value of i is =" + result); } @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub int value = values[0]; progressBar.setProgress(value); super.onProgressUpdate(values); } }
注意在这个类中的构造方法需要传递两个参数,一个是TextView,一个是ProgressBar,而在AsyncTask<Integer, Integer, String>中是你需要用到的类型的变量,其中第一个变量类型是由MainActivity.java中执行execute方法传递进去的参数。
那么MainActivity.java的代码:
package com.example.test; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.ProgressBar; import android.widget.TextView; public class MainActivity extends Activity { private TextView textView; private ProgressBar progressBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textView1); progressBar = (ProgressBar) findViewById(R.id.progressBar1); ProgressBarAsyncTask progressBarAsyncTask = new ProgressBarAsyncTask( textView, progressBar); progressBarAsyncTask.execute(1000); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
在异步任务类中有一个NetOperatior类,该类的用于主要用于模拟下载任务,里面的方法就是让当前的线程休息一秒,注意这里的线程不是在UI线程中执行的,而OnPreExecute()方法和OnPostExecute()方法是在UI线程中执行的,所以在这里都可以与界面进行交互。
NetOperatior.java:
package com.example.test; public class NetOperatior { public void operate() { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
标签:
原文地址:http://www.cnblogs.com/sowhat4999/p/4496713.html