AsyncTask异步任务

AsyncTask:【a/thik/task】

主要作用:
1.子线程中更新UI
2.封装,简化异步(耗时)操作。

AsyncTask<Params,Progress,Result>是一个抽象类,使用时要继承它。
 1. Params:启动任务时输入参数的类型。
 2. Progress:onProgressUpdate()执行完成后返回结果类型。
 3. Result:doInBackground()执行完成后返回结果的类型

常用方法-执行顺序
 1. onPreExcute:启动异步任务时原线程的初始化操作。
 2. doInBackground:必须重写的方法,异步执行后台线程的操作。
 3. onProgressUpdate:在doInBackground()中用执行publishProgress()语句调用此方法。
 4. onPostExcute():将doInBackgroubd()的返回值传给该方法并调用。
 5. 创建对象,通过m_asy.execute(Params)启动异步任务。其参数传给doInBackground()中。 
public class MainActivity extends Activity {
    Button btn;
    ProgressBar m_progressbar;
    ImageView m_imageview;
    /* 项目需要网络链接,不要忘记在Androidmanifest文件中添加权限
    <uses-permission  android:name="android.permission.INTERNET"/>*/
    String url="http://img3.doubanio.com/view/photo/photo/public/p2103400229.jpg";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn=(Button) findViewById(R.id.button1);
        m_imageview=(ImageView) findViewById(R.id.imageView1);
        m_progressbar=(ProgressBar) findViewById(R.id.progressBar1);
        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                MyAsyncTask m_asy= new MyAsyncTask();
                m_asy.execute(url);

            }
        });

    }
    class MyAsyncTask extends AsyncTask<String,Void,Bitmap>{

        @Override
        protected Bitmap doInBackground(String... arg0) {
            // TODO Auto-generated method stub
            String url = arg0[0];
            Bitmap bitmap=null;
            URLConnection connection;
            InputStream is;

                    try {
                        connection = new URL(url).openConnection();
                        is = connection.getInputStream();
                        BufferedInputStream bis = new BufferedInputStream(is);
                        Thread.sleep(3000);
                        bitmap = BitmapFactory.decodeStream(bis);
                        is.close();
                        bis.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }       
            return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            // TODO Auto-generated method stub
            super.onPostExecute(bitmap);
            m_imageview.setImageBitmap(bitmap);
            m_progressbar.setVisibility(View.GONE);
        }

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            m_progressbar.setVisibility(View.VISIBLE);
        }       
    }
}

取消AsyncTask

AsyncTask中执行按照线程池中的顺序,所以当前异步处理未完成前不会执行下一个任务。而在Java中无法粗暴的终结一个线程。
但可在特定的方法中给线程添加cancel标记,并在doInBackground和onProgressUpdate根据if语句判断m_asy的状态,如果为标记状态,则结束当前执行的操作(并不是终结这个线程,而是执行完了这个线程)。

//在onPause()等方法中,给m_asy添加标记。 
if(m_asy != null &&//不为空且RUNNING中
 m_asy.getStatus()= AsyncTask.Status.RUNNING){
m_asy.cancel(true);
//在doInBackground,判断m_asy的状态
if(iscancel()){
break;
}
//在onProgressUpdate()中,判断m_asy的状态
if(iscancel()){
return;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值