完结思路是:
1:在UI线程中发动一个线程,让这个线程去下载图片。
2:图片完结下载后发送一个音讯去告诉UI线程
2:UI线程获取到音讯后,更新UI。
这儿的UI线程便是主线程。
这两个过程涉及到一些知识点,便是:ProgressDialog,Handler,Thread/Runnable,URL,HttpURLConnection等等一系列东东的运用。
现在让咱们开端来完结这个功用吧!
第一步:新建项目。
第二步:设计好UI,如下所示
View Code
android:orientation=vertical
android:layout_width=fill_parent
android:layout_height=fill_parent
>
android:id=@+id/btnFirst
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=异步下载方式一
>
android:id=@+id/btnSecond
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=异步下载方式二
>
android:layout_width=fill_parent
android:layout_height=match_parent
android:id=@+id/frameLayout
>
android:id=@+id/image
android:layout_width=match_parent
android:layout_height=match_parent
android:scaleType=centerInside
android:padding=2dp
>
android:id=@+id/progress
android:layout_width=wrap_content
android:layout_height=wrap_content
android:layout_gravity=center>
第三步:获取UI相应View组件,并增加事情监听。
View Codepublic class DownLoaderActivityextends Activityimplements OnClickListener{
private static final String params=2hdb53fcq2o.jpg/800px-Hukou_Waterfall.jpg;
private Button btnFirst,btnSecond;
private ProgressBar progress;
private FrameLayout frameLayout;
private Bitmap bitmap=null;
ProgressDialog dialog=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnFirst=(Button)this.findViewById(R.id.btnFirst);
btnSecond=(Button)this.findViewById(R.id.btnSecond);
progress=(ProgressBar)this.findViewById(R.id.progress);
progress.setVisibility(View.GONE);
frameLayout=(FrameLayout)this.findViewById(R.id.frameLayout);
btnFirst.setOnClickListener(this);
btnSecond.setOnClickListener(this);
}
第四步:在监听事情中处理咱们的逻辑,便是下载服务器端图片数据。
这儿咱们需求解说一下了。
一般的咱们把一些耗时的工效果别的一个线程来操作,比方,下载上传图片,读取大批量XML数据,读取大批量sqlite数据信息。为什么呢?答案咱们都理解,用户体会问题。
在这儿,首要我结构一个进展条对话框,用来显现下载进展,然后拓荒一个线程去下载图片数据,下载数据结束后,告诉主UI线程去更新显现咱们的图片。
Handler是交流Activity 与Thread/runnable的桥梁。而Handler是运行在主UI线程中的,它与子线程能够经过Message目标来传递数据。详细代码如下:
View Code
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg){
switch(msg.what){
case 1:
//封闭
ImageView view=(ImageView)frameLayout.findViewById(R.id.image);
view.setImageBitmap(bitmap);
dialog.dismiss();
break;
}
}
};
咱们在这儿弹出进展对话框,运用HTTP协议来获取数据。
View Code//前台ui线程在显现ProgressDialog,
//后台线程在下载数据,数据下载结束,封闭进展框
@Override
public void onClick(View view) {
switch(view.getId()){
case R.id.btnFirst:
dialog= ProgressDialog.show(this,,
下载数据,请稍等 …,true,true);
//发动一个后台线程
handler.post(new Runnable(){
@Override
public void run() {
//这儿下载数据
try{
URL url= new URL(params);
HttpURLConnection conn= (HttpURLConnection)url.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream inputStream=conn.getInputStream();
bitmap= BitmapFactory.decodeStream(inputStream);
Message msg=new Message();
msg.what=1;
handler.sendMessage(msg);
}catch (MalformedURLException e1) {
e1.printStackTrace();