Tears_fg

导航

Android_AsyncTask_Method

package com.example.day07_asynctask_method;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.util.Log;
import android.view.Menu;
import android.view.View;
/**
1.问题:当我们请求网络数据,解析大数据,读写大数据时 ,需要进行耗时操作---用户体验差
      当用户频繁的执行耗时操作时,会出现程序无法响应异常
    当用户进行操作(如点击屏幕),程序在5s内没有进行响应,就会出现程序无法响应异常---anr异常
    原因:阻塞了主线程
    解决: 把耗时操作放到子线程中去执行

2.问题: Only the original thread that created a view hierarchy can touch its views.
   只能在主线程(ui线程)中进行ui的修改操作

  解决:把数据发送到主线程,让主线程去修改ui

3.asyncTask 异步任务 ---  在子线程中进行耗时操作,耗时操作完后自动的将数据发送到主线程,用户在主线程进行数据操作 
    1.去继承asyncTask抽象类
    2.实现未实现的方法
    3.调用,执行该类

 * 
 * @author my
 *
 */
public class MainActivity extends Activity {

    public static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    //下载图片按钮点击事件
    public void onDownLoadImg(View v){
        //执行异步任务
        new MyAsynctask().execute("需传参数");
    }
    /**
     * 方法执行顺序 onPreExecute-doInBackground--onPostExecute
     * @author my
     *
     */
    class MyAsynctask extends AsyncTask<String, Integer, Bitmap>{
        /**
         * 在主线程中执行--在doInBackground方法前执行,通常显示正在加载提示
         */
        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            Log.i(TAG, "MainActivity--onPreExcute--threadName  ="+Thread.currentThread().getName()+",id = "+Thread.currentThread().getId());
        }
    /*
     *     在子线程中执行--执行耗时操作,
     * 参数类型与该类泛型的第一个参数一致,与执行者的execute的参数类型也对应,execute的参数会传到doInBackground方法中
     * 返回值类型与类的第三个参数一致,与onPostExecute方法中传入的参数也一致
     * 耗时操作执行完后才能后会将结果传给onPostExecute方法
     * 
     */
        @Override
        protected Bitmap doInBackground(String... params) {
            // TODO Auto-generated method stub
            Log.i(TAG, "MainActivity--doInBackground--threadName  ="+Thread.currentThread().getName()+",id = "+Thread.currentThread().getId());
            return null;
        }
        /**
         * 在主线程中执行--用来处理结果(通常用来显示数据)
         * 会接收doInBackground传过来的数据
         */
        
        @Override
        protected void onPostExecute(Bitmap result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            Log.i(TAG, "MainActivity--onPostExecute--threadName  ="+Thread.currentThread().getName()+",id = "+Thread.currentThread().getId());
        }
        /**
         * 用来更新进度时调用--在主线程中执行
         * 调用需要用户去执行
         * 参数类型与该类泛型的第二个参数对应,一般表示当前的加载进度
         */
        @Override
        protected void onProgressUpdate(Integer... values) {
            // TODO Auto-generated method stub
            super.onProgressUpdate(values);
        }

    }

}

 

posted on 2016-08-02 21:36  Tears_fg  阅读(188)  评论(0编辑  收藏  举报