最近接触到android的学习,感觉多线程编程有点麻烦,花了部分时间学习了一下,下面是两个案例
1.用了异步操作AsyncTask类实现从远程服务器上获得图片,不要忘记AndroidManifest.xml添加<uses-permission android:name="android.permission.INTERNET"/>
package com.example.asynctask_download;
import org.apache.http.HttpEntity;
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 org.apache.http.util.EntityUtils;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity {
private Button button = null;
private ImageView imageView = null;
private String IMG_PATH = "http://www.baidu.com/img/bdlogo.gif";
private ProgressDialog dialog = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView)this.findViewById(R.id.imageView1);
button = (Button)this.findViewById(R.id.button1);
dialog = new ProgressDialog(this);
dialog.setTitle("提示");
dialog.setMessage("正在下载,请稍后。。");
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//
new MyAsyncTask().execute(IMG_PATH);
}
});
}
/*
* 使用异步操作的方法
* 自己声明的类要继承AsyncTask<String, Void, Bitmap>
* 其中第一次参数表示要执行的任务,通常是网络的路径
* 第二个参数是进度的刻度
* 第三个参数表示任务执行的返回结果
*/
public class MyAsyncTask extends AsyncTask<String, Void, Bitmap>{
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog.show();
}
@Override
protected Bitmap doInBackground(String... params) {
//使用HttpClient连接网络
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(params[0]);
Bitmap bitmap = null;
try{
HttpResponse httpResponse = httpClient.execute(httpGet);
if(httpResponse.getStatusLine().getStatusCode() == 200){
HttpEntity entity = httpResponse.getEntity();
byte[] data = EntityUtils.toByteArray(entity);
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
}
}catch(Exception e){
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
imageView.setImageBitmap(result);
dialog.dismiss();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
package com.example.asynctask_download;
import org.apache.http.HttpEntity;
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 org.apache.http.util.EntityUtils;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity {
private Button button = null;
private ImageView imageView = null;
private String IMG_PATH = "http://www.baidu.com/img/bdlogo.gif";
private ProgressDialog dialog = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView)this.findViewById(R.id.imageView1);
button = (Button)this.findViewById(R.id.button1);
dialog = new ProgressDialog(this);
dialog.setTitle("提示");
dialog.setMessage("正在下载,请稍后。。");
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//
new MyAsyncTask().execute(IMG_PATH);
}
});
}
/*
* 使用异步操作的方法
* 自己声明的类要继承AsyncTask<String, Void, Bitmap>
* 其中第一次参数表示要执行的任务,通常是网络的路径
* 第二个参数是进度的刻度
* 第三个参数表示任务执行的返回结果
*/
public class MyAsyncTask extends AsyncTask<String, Void, Bitmap>{
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog.show();
}
@Override
protected Bitmap doInBackground(String... params) {
//使用HttpClient连接网络
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(params[0]);
Bitmap bitmap = null;
try{
HttpResponse httpResponse = httpClient.execute(httpGet);
if(httpResponse.getStatusLine().getStatusCode() == 200){
HttpEntity entity = httpResponse.getEntity();
byte[] data = EntityUtils.toByteArray(entity);
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
}
}catch(Exception e){
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
imageView.setImageBitmap(result);
dialog.dismiss();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
2.用了Handler和Thread来实现多线程
package com.example.handler_message;
import java.io.IOException;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity {
private Button button = null;
private ImageView imageView = null;
private String image_path = "http://www.baidu.com/img/bdlogo.gif";
private final int IS_FINISH = 1;
private ProgressDialog dialog;
private Handler handler = new Handler(){
@Override
public void handleMessage(android.os.Message msg) {
byte[] data = (byte[])msg.obj;
Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);
imageView.setImageBitmap(bm);
if(msg.what == IS_FINISH){
dialog.dismiss();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button)this.findViewById(R.id.button1);
imageView = (ImageView)this.findViewById(R.id.imageView1);
dialog = new ProgressDialog(this);
dialog.setTitle("提示");
dialog.setMessage("正在下载,请稍后。。。");
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
new Thread(new MyThread()).start();
}
});
}
class MyThread implements Runnable{
@Override
public void run() {
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(image_path);
HttpResponse httpResponse = null;
try {
httpResponse = httpClient.execute(httpGet);
if(httpResponse.getStatusLine().getStatusCode() == 200){
byte[] data = EntityUtils.toByteArray(httpResponse.getEntity());
Message message = Message.obtain();
message.obj = data;
message.what = IS_FINISH;
handler.sendMessage(message);
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
这两个案例是基本的用法,希望对android初学者有帮助