子线程消息被阻挡
主要内容:本文讲述一种由于变成原因造成的子线程消息一直无法响应的情况以及其解决方法
功能描述:点击按钮后客户端从服务器获取名称图片列表,接着对图片进行下载。
MainActivity中
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/******************************
其他操作程序
******************************/
//消息处理
handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
if(msg.what == 0x101)
{
imgList = (String[]) msg.obj;
}
}
}
//按钮点击事件
public void click1(View v)
{
//开启子线程获取服务器图像列表
ImgListThread downloadImg = new ImgListThread(handler); //(1)
//等待缩略图下载完成再切换到GridView显示界面
while(imgList== null){} //(2)
/********************
图像下载程序
*********************/
}
ImgListThread中
public class ImgListThread implements Runnable
{
private Handler handler;
public ImgListThread(Handler mHandler)
{
handler = mHandler;
}
public void run()
{
/*********************************
获取服务器图片列表,放入imgList[]中
*********************************/
Message msg = handler.obtainMessage();
msg.obj = imgList;
msg.what = 0x101;
handler.sendMessage(msg);
}
}
问题:点击按钮后,由语句(1)进入子线程ImgListThread中,但子线程中的Mseeage消息一直无法传递给主线程。主线程也就一直无法获取图片列表,一直处于语句(2)位置,死循环。
错因:由语句(1)进入子线程后,主线程一直停留在语句(2)循环当中,则主线程一直处于被占用状态,无暇对子线程返回的Message消息进行处理。
解决方法:去掉while语句,同时将获取图片列表后的下载与操作放在handler消息响应中。这样主线程就可以对ImgListThread消息进行响应,同时可以实现获取图像列表后自动下载图片。