AsyncTask异步任务-两种用法

来源:互联网 发布:java实例化是什么意思 编辑:程序博客网 时间:2024/06/07 12:54

感谢博主: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;@Overrideprotected 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() {@Overridepublic void onClick(View arg0) {connect();}});findViewById(R.id.send).setOnClickListener(new View.OnClickListener() {@Overridepublic 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>() {@Overrideprotected 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 blocke.printStackTrace();}return null;}@Overrideprotected 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 blocke.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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView() {// TODO Auto-generated method stubmProgressBar = (ProgressBar) findViewById(R.id.progressBar);mButton = (Button) findViewById(R.id.button);mImageView = (ImageView) findViewById(R.id.imageView);mButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubMyAsyncTask task = new MyAsyncTask();task.execute("http://pic1.nipic.com/20090320/63264_122710088_2.jpg");}});} class MyAsyncTask extends AsyncTask<String, Integer, Bitmap> {@Overrideprotected 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;}@Overrideprotected void onPreExecute() {//在 doInBackground()之前被调用,在ui线程执行mImageView.setImageBitmap(null);mProgressBar.setProgress(0);super.onPreExecute();}@Overrideprotected 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);}@Overrideprotected void onProgressUpdate(Integer... values) {//在调用publishProgress之后被调用,在ui线程执行  mProgressBar.setProgress(values[0]);super.onProgressUpdate(values);}@Overrideprotected void onCancelled() {//在ui线程执行mProgressBar.setProgress(0);super.onCancelled();}}}


1 0