感谢博主:
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();
}
}
}