首先
由于安卓对于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.csdn.net/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));
}
});
}
}