AsyncTask异步任务-两种用法


感谢博主: http://blog.csdn.net/mylzc/article/details/6774131 分享


异步任务,如果不是阻塞式的(如:Socket通信),而是有结果的(不管是否成功,如从网络上下载资源),复写的方法有不同。

1.Socket通信,需要复写doInBackground,onProgressUpdate,消息的接受可以在onProgressUpdate方法中。

代码:

package com.jikexueyuan.mysocketclient;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

	EditText ip;
	EditText editText;
	TextView text;

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

		ip = (EditText) findViewById(R.id.ip);
		editText = (EditText) findViewById(R.id.edit);
		text = (TextView) findViewById(R.id.text);

		findViewById(R.id.connect).setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View arg0) {
				connect();
			}
		});

		findViewById(R.id.send).setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View arg0) {
				send();
			}
		});
	}

	//-------------------------------------

	Socket socket = null;
	BufferedWriter writer = null;
	BufferedReader reader = null;

	public void connect() {

		
		AsyncTask<Void, String, Void> read = new AsyncTask<Void, String, Void>() {

			@Override
			protected Void doInBackground(Void... arg0) {//处理后台执行的任务,在后台线程执行
				try {
					socket = new Socket(ip.getText().toString(), 10001);
					writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
					reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
					publishProgress("@success");//将会调用onProgressUpdate
				} catch (UnknownHostException e1) {
					Toast.makeText(MainActivity.this, "无法建立链接", Toast.LENGTH_SHORT).show();
				} catch (IOException e1) {
					Toast.makeText(MainActivity.this, "无法建立链接", Toast.LENGTH_SHORT).show();
				}
				try {
					String line;
					while ((line = reader.readLine())!= null) {
						publishProgress(line);
					}
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				return null;
			}

			@Override
			protected void onProgressUpdate(String... values) {//在调用publishProgress之后被调用,在ui线程执行  
				if (values[0].equals("@success")) {
					Toast.makeText(MainActivity.this, "链接成功!", Toast.LENGTH_SHORT).show();
					
				}
				text.append("Server:"+values[0]+"\n");
				super.onProgressUpdate(values);
			}
		};
		read.execute();

	}

	public void send() {
		try {
			text.append("我说:"+editText.getText().toString()+"\n");
			writer.write(editText.getText().toString()+"\n");
			writer.flush();
			editText.setText("");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

 2.下载图片,代码如下:

package com.example.asynctasktest;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.Toast;

public class MainActivity extends Activity {
	private ProgressBar mProgressBar;
	private Button mButton;
	private ImageView mImageView;

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

	private void initView() {
		// TODO Auto-generated method stub
		mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
		mButton = (Button) findViewById(R.id.button);
		mImageView = (ImageView) findViewById(R.id.imageView);
		mButton.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				MyAsyncTask task = new MyAsyncTask();
				task.execute("http://pic1.nipic.com/20090320/63264_122710088_2.jpg");
			}
		});
	}
 class MyAsyncTask extends AsyncTask<String, Integer, Bitmap> {

		@Override
		protected Bitmap doInBackground(String... params) {//处理后台执行的任务,在后台线程执行
			publishProgress(0);
			HttpClient hc = new DefaultHttpClient();
			publishProgress(30);
			HttpGet hg = new HttpGet(params[0]);
			final Bitmap bm;
			try {
				HttpResponse hr = hc.execute(hg);
				bm = BitmapFactory.decodeStream(hr.getEntity().getContent());
			} catch (Exception e) {
				return null;
			} 
			publishProgress(100);
			return bm;
		}

		@Override
		protected void onPreExecute() {//在 doInBackground()之前被调用,在ui线程执行
			mImageView.setImageBitmap(null);
			mProgressBar.setProgress(0);
			super.onPreExecute();
		}

		@Override
		protected void onPostExecute(Bitmap result) {//后台任务执行完之后被调用,在ui线程执行
			if(result != null){
				Toast.makeText(MainActivity.this, "获取成功", Toast.LENGTH_SHORT).show();
				mImageView.setImageBitmap(result);
			} else {
				Toast.makeText(MainActivity.this, "获取失败", Toast.LENGTH_SHORT).show();
			}
			super.onPostExecute(result);
		}

		@Override
		protected void onProgressUpdate(Integer... values) {//在调用publishProgress之后被调用,在ui线程执行  
			mProgressBar.setProgress(values[0]);
			super.onProgressUpdate(values);
		}

		@Override
		protected void onCancelled() {//在ui线程执行
			mProgressBar.setProgress(0);
			super.onCancelled();
		}
		

	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值