现在的位置: 首页 > 综合 > 正文

android多线程2

2017年11月18日 ⁄ 综合 ⁄ 共 5640字 ⁄ 字号 评论关闭

Handler Message()

/**

 * android3.0以后不允许在主线程访问网络,可用线程来处理

 * @author YangQuanqing 

 *

 */

public class MainActivity extends Activity {

 

private Button btn=null;

private ImageView image=null;

private String image_path="http://f2.sjbly.cn/m13/0729/1459/6947edn_690x459_b.jpg";

private Bitmap bitmap=null;

private ProgressDialog dialog=null;

private Handler handler=new Handler(){

 

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

//获得数据

byte[]data=(byte[]) msg.obj;

//数据解码

bitmap=BitmapFactory.decodeByteArray(data, 0, data.length);

//显示

image.setImageBitmap(bitmap);

if(msg.what==0x123)

{

dialog.dismiss();

}

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

btn=(Button)this.findViewById(R.id.button1);

image=(ImageView)this.findViewById(R.id.imageView1);

dialog=new ProgressDialog(this);

dialog.setTitle("提示信息");

dialog.setMessage("下载中,请稍候......");

btn.setOnClickListener(new OnClickListener(){

 

@Override

public void onClick(View arg0) {

//启动实现接口的线程

new Thread(new MyThread()).start();

dialog.show();

//image.setImageBitmap(bitmap);

}

});

}

 

class MyThread implements Runnable{

 

//该线程完成下载耗时操作

@Override

public void run() {

//获得访问网络资源的HttpClient实例

HttpClient httpClient=new DefaultHttpClient();

//设置访问网络资源的请求方式

HttpGet httpGet=new HttpGet(image_path);

InputStream in=null;

ByteArrayOutputStream out=new ByteArrayOutputStream();

HttpEntity httpEntity=null;

try {

//执行请求获得响应

HttpResponse httpResponse=httpClient.execute(httpGet);

//判断请求是否成功

if(httpResponse.getStatusLine().getStatusCode()==200)

{

//请求响应成功

//获得输入流

httpEntity=httpResponse.getEntity();

///////////////////////////////////////

//方式1

//获得输入流

//in=httpResponse.getEntity().getContent();

/*//把输入流写入内存流里

int len=0;

byte[] buffer=new byte[1024];

while((len=in.read(buffer))!=-1)

{

out.write(buffer, 0, len);

}

byte[] data=out.toByteArray();

*/

///////////////////////////////////////

//方式2转换成字节数组

byte[] data=EntityUtils.toByteArray(httpEntity);

//通过Message类把子线程的数据带给主线程

//获得Message对象

Message message=Message.obtain();

//消息携带数据

message.obj=data;

//判断是否结束

message.what=0x123;

//子线程发送消息给主线程的Handler类处理

handler.sendMessage(message);

}

catch (ClientProtocolException e) {

// TODO Auto-generated catch block

e.printStackTrace();

catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}}}

 

 

 

 

 

 

 

 

 

 

Handler Message(二)

/**

 * obtain()方法可以传Message的参数但必须要设置目标msg.sendToTarget();

 * @author YangQuanqing yqq

 *

 */

public class MainActivity extends Activity {

 

private Button btn=null;

private Handler handler=new Handler(){

 

@Override

public void handleMessage(Message msg) {

//super.handleMessage(msg);

System.out.println(msg.arg1);

System.out.println(msg.arg2);

System.out.println(msg.obj);

System.out.println(msg.what);

//获得bundle对象

Bundle data=msg.getData();

System.out.println(data.getStringArray("mang_str").length);

Log.i("Handler_Message<<<",msg.arg1+"");

Log.i("Handler_Message<<<",msg.arg2+"");

Log.i("Handler_Message<<<",msg.obj+"");

Log.i("Handler_Message<<<",msg.what+"");

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

btn=(Button)this.findViewById(R.id.button1);

btn.setOnClickListener(new OnClickListener()

{

 

@Override

public void onClick(View v) {

//启动子线程

new Thread(new MyThread()).start();

}

});

}

 

public class MyThread implements Runnable{

 

@Override

public void run() {

//第一种方式

////获得Message对象

//Message msg=Message.obtain();

////给消息添加数据

//msg.arg1=1;

//msg.arg2=2;

//msg.obj="android";

//msg.what=12306;

//handler.sendMessage(msg);

//第二种方式

//Message msg=Message.obtain(handler);

////给消息添加数据

//msg.arg1=1;

//msg.arg2=2;

//msg.obj="android";

//msg.what=12306;

//msg.sendToTarget();

//第三种方式

Message msg=Message.obtain(handler,999);

//给消息添加数据

msg.arg1=11;

msg.arg2=22;

msg.obj="android123";

//复杂数据类型

Bundle data=new Bundle();

data.putStringArray("mang_str"new String[]{"aaa","bbb","ccc"});

msg.setData(data);

msg.sendToTarget();

}

}

@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;

}

 

}

 

 

 

 

HandlerMessage

 

public class MainActivity extends Activity implements OnClickListener {

 

private Button postBtn=null;

private Button sendBtn=null;

//接收或者发送消息 从消息队列中提取消息用于更新UI操作

private Handler handler=new Handler(){

 

@Override

public void handleMessage(Message msg) {

Log.i("<<<<<<<<what", msg.what+"");

Log.i("<<<<<<<<arg1", msg.arg1+"");

Log.i("<<<<<<<<arg2", msg.arg2+"");

Log.i("<<<<<<<<object", msg.obj+"");

super.handleMessage(msg);

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

sendBtn=(Button)this.findViewById(R.id.button1);

sendBtn.setOnClickListener(this);

postBtn=(Button)this.findViewById(R.id.button2);

postBtn.setOnClickListener(this);

}

 

@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;

}

 

@Override

public void onClick(View v) {

switch(v.getId())

{

case R.id.button1:

//新起一个线程

new Thread(new Runnable(){

 

@Override

public void run() {

//方式一what

//handler.sendEmptyMessage(12306);

//方式二 what

//handler.sendEmptyMessageAtTime(222, 500);

//方式三延时 what

//handler.sendEmptyMessageDelayed(33311, 10000);

//方式四

//Message msg=Message.obtain();

//msg.what=10086;

//方式五

Message msg=handler.obtainMessage(10086,10088, 10090,"android");

handler.sendMessage(msg);

}

}).start();

break;

case R.id.button2:

boolean flag=handler.post(new Runnable(){

 

@Override

public void run() {

Message msg=handler.obtainMessage(1,88, 90,"android and java");

}

});

Log.i("<<<<",flag+"");

break;

}

}

 

}

【上篇】
【下篇】

抱歉!评论已关闭.