安卓异步—AsysncTask

本文介绍如何使用AsyncTask在Android应用中异步加载图片,并展示了一个具体的例子,包括使用OKHTTP获取网络图片并转换为Bitmap的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先


由于安卓对于UI的 操作只能在主线程中,所以一些相关的耗时操作只能在子线程中完成所以一般在子线程中完成操作后一般会调用

Activity.runOnUIThread(Runnable)

来返回主线程但是有时候这样的操作会过于繁琐


所以我们可以用AsyncTask来进行异步操作

由于AsyncTask 是一个抽象类 我们在使用的时候必须去实现它的方法。 继承是它指定了3个泛型参数

1.prams 在执行AsynTask时候需要传入的参数 比如加载网页 我们可以传入URL
2.progress 后台执行任务时候如果需要在界面上显示当前进度则他就可以指定我进度的单位
2.Result 当任务执行完成是 的返回值

其中doInbackground 的方法是必须实现的 我们应该在它里面进行耗时操作
onpostExecute方法是用来返回主线程操作的


具体实例

AsyncTask加载图片

public class textforAsyncTsak extends AppCompatActivity {
    private String Url = "https://img-my.youkuaiyun.com/uploads/201504/12/1428806103_9476.png";
    private ImageView mimageView;
    private ProgressBar mprogressBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_textfor_async_tsak);
        mimageView = (ImageView) findViewById(R.id.muuc);
        mprogressBar = (ProgressBar) findViewById(R.id.AsyncTack);
        AsyncTaskdemo asyncTaskdemo = new AsyncTaskdemo();
        asyncTaskdemo.execute(Url);
    }
    class AsyncTaskdemo extends AsyncTask<String,Void,Bitmap>{
        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            mprogressBar.setVisibility(View.VISIBLE);

        }

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);

        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            //mprogressBar.setVisibility(View.INVISIBLE);
            mimageView.setImageBitmap(bitmap);
        }

        @Override
        protected Bitmap doInBackground(String... params) {
            Bitmap bitmap = null;
            try{
                OkHttpClient client = new OkHttpClient();
                Request requuset = new Request.Builder()
                        .url(Url)
                        .build();
                Response response = client.newCall(requuset).execute();
                InputStream is = response.body().byteStream();
                BufferedInputStream bu = new BufferedInputStream(is);
                bitmap = BitmapFactory.decodeStream(bu);

            } catch (IOException e) {
                e.printStackTrace();
            }
            return bitmap;

        }
    }
}

这里我们用到了OKHTTP去解析网上的文件 然后转化成输入流 在转为biymap 类型变量来加载

我们可以看到具体的操作全部在doInBackground中进行 而在onPostExecte 方法中 他就是主线程操作

值得一提的是 如果要调用到 onProgressUpate方法我们需要在doInBackground 中调用publishProgress()方法即可
至于在活动中调用就是在下面的代码中用对象调用.execute(); 即可运行

AsyncTaskdemo2 asyncTaskdemo2 = new AsyncTaskdemo2();
        asyncTaskdemo2.execute();

然后我们在用一个Activity去调用这个Activity 完成操作

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.image_set);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this,textforAsyncTsak.class));


            }
        });
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值