从网络中下载一张图片.用户可以手动取消下载

package com.flashget.age.touch;

import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;


/**
 * @author 小阿哥
 * @fuction 从网络中获取一张图片.用户可以手动取消下载.
 * 
 * */
public class MainActivity extends Activity {
	/** Called when the activity is first created. */
	static MainActivity activity;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		activity = this;
		setContentView(new MyView(this));
	}
}

class MyView extends View {
	
	Bitmap bitmap=null;
	ProgressDialog pd=null;
	Thread t = null;
	
	public MyView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		getBitmap();
		this.setFocusableInTouchMode(true);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		super.onDraw(canvas);
		canvas.drawColor(Color.RED);
		System.out.println("onDraw....");
		if (bitmap != null) {
			canvas.drawBitmap(bitmap, 0, 0, null);
		}
	}
	
	private void getBitmap() {
		//设置对话框...
		pd = new ProgressDialog(this.getContext());
		pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		pd.setTitle("小阿哥加载美女图片");
		pd.setMessage("美女加载中....");
		pd.setCancelable(false);
		pd.setButton("取消", new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				// TODO Auto-generated method stub
				t.interrupt();
				System.out.println("手动强制停止线程..");
			}
		});
		pd.show();		

		//启动线程...
		t = new Thread(new Runnable() {
			int progress = 0;
			@Override
			public void run() {
				// TODO Auto-generated method stub
				//下面代码片段都是浮云....
				while (progress < 100) {
					progress += 10;
					MainActivity.activity.runOnUiThread(new Runnable() {
						@Override
						public void run() {
							// TODO Auto-generated method stub
							pd.setProgress(progress);
						}
					});
					try {
						Thread.sleep(1000);
					} catch (Exception ex) {
						progress = 500;
						System.out.println("Thread....EX:" + ex.toString());
					}
				}				
				//当手动强制取消后,直接返回..
				if (progress == 500) {
					return;
				}
				//从网络中获得一张图片.
				try {
					URL url = new URL(
							"http://www.hsqzone.cn/about/UploadPic/2011-1/2011143928414.gif");
					HttpURLConnection urlConnection = (HttpURLConnection) url
							.openConnection();
					if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
						bitmap = BitmapFactory.decodeStream(urlConnection
								.getInputStream());
					}
					urlConnection.disconnect();
					urlConnection = null;
				} catch (Exception e) {
					// TODO Auto-generated catch block
					System.out.println("Connection..EX" + e.toString());					
				}
				System.out.println("bitmap:" + bitmap);
				//取消对话框...
				pd.dismiss();
				//更新视图...
				MyView.this.postInvalidate();
			}
		});
		t.start();
	}
}

 

stop造成死锁,已经被废除了,现在大部分是设置flag

如果是持续运行的话,在run里面while(flag){},想停止设置未false就可以了.

如果不是持续运行的话.那么可以使用interrupt()来终止线程.

你可能感兴趣的:(thread,android,.net,OS)