一丶代码见本文
二丶课程讲解
这里是AsyncTask的基本方法及运用
public class Async extends AppCompatActivity { TextView info; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_async); info = (TextView) findViewById(R.id.info); } public void asyncTasks(View view) { //开始执行异步,可以传上参数,也可以不传 new Myasync(this).execute(); } /*** * 通过一个 AsyncTask 实现一个异步任务 */ private static class Myasync extends AsyncTask<String, Integer, String> { Async as; //定义构造方法,用于可以访问 外部类的 UI 组件 public Myasync(Async activity) { as = activity; } //执行任务之前触发的事件方法,可以在该方法中做一些 初始化工作 @Override protected void onPreExecute() { super.onPreExecute(); as.info.setText("任务开始^"); } //执行后台任务的方法,类似于线程,所以不能在该方法中访问UI组件 @Override protected String doInBackground(String... params) { for (int i = 0; i < 10; i++) { Log.i("ms", i + ""); publishProgress(i);//更新进度,也就是调用onProgressUpdate方法 try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } return "sucess"; } //更新进度值 @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); as.info.setText("当前的任务值" + values[0]); } //当doInBackground 方法返回被调用 @Override protected void onPostExecute(String s) { super.onPostExecute(s); as.info.setText(s); } } }
AsyncTask实现下载例子:
1.权限设置
//下载权限 <uses-permission android:name="android.permission.INTERNET"></uses-permission> //写权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>2.布局
//下载按钮 <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="下载图片" android:id="@+id/button3" android:layout_alignParentTop="true" android:onClick="downImages" /> //进度条 <ProgressBar style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/progressBar" android:layout_below="@+id/button3" android:layout_centerHorizontal="true"/> //提示完成下载 <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="no date" android:id="@+id/vt" android:layout_below="@+id/progressBar" android:layout_marginTop="67dp"/>3.MainActivity.java
public class Main1226Activity extends AppCompatActivity { private ProgressBar pb; private TextView info; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main1226); pb = (ProgressBar) findViewById(R.id.progressBar); info = (TextView) findViewById(R.id.vt); } /*** * 下载图片 * * @param v */ public void downImages(View v) { new DownLoadAsyncTask(this).execute("http://img2.3lian.com/img2007/19/33/005.jpg"); } private static class DownLoadAsyncTask extends AsyncTask<String, Integer, Integer> { Main1226Activity activity; public DownLoadAsyncTask(Main1226Activity downImag) { this.activity = downImag; } //初始化化 @Override protected void onPreExecute() { super.onPreExecute(); activity.pb.setProgress(0); } @Override protected Integer doInBackground(String... params) { String p = params[0]; try { URL url = new URL(p); //打开URL连接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); int size = conn.getContentLength();//获取文件大小 //0 标记表示需要更新最大进度值 publishProgress(0, size); byte[] bytes = new byte[5]; int len = -1; InputStream in = conn.getInputStream(); FileOutputStream out = new FileOutputStream("/sdcard/" + System.currentTimeMillis() + ".jpg"); while ((len = in.read(bytes)) != -1) { out.write(bytes, 0, len); //1 标记更新进度值 publishProgress(1, len); out.flush(); } } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return 200; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); switch (values[0]) { case 0: activity.pb.setMax(values[1]); break; case 1: activity.pb.incrementProgressBy(values[1]); break; } } @Override protected void onPostExecute(Integer integer) { super.onPostExecute(integer); if (integer == 200) { activity.info.setText("下载完成"); } } } }
三丶演示效果:
这节就到这里,由于文件存储与流没学,所以理解上有点问题,后期加强