进程简单的理解就是:启动一个应用就是一个进程.每个应用有可能多个线程.如果一个android的主线程即main线程中执行了耗时操作,android系统可能会弹出ANR(Activity or App is not responding)对话框,严重影响了用户体验,会导致用户不会再使用该应用软件.ANR产生的条件是:
1) Activity中的事件执行超过5秒,操作没有响应就会弹出ANR;
2) 广播接收者onReceive()方法执行超过10秒,其他操作没有响应也会弹出ANR
解决ANR的办法就是在main线程中另起新线程来处理耗时操作:
例如:(部分代码)
new Thread()
{
public void run()
{
// 模拟耗时操作
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
String result = "从网络获取的结果";
Message msg = new Message();
msg.what = 1;
msg.obj = result;
// 发送到main线程
mHandler.sendMessage(msg);
// textView.setText(result);
}
}.start();
虽然这可以解决ANR问题,但是如果在新线程中更新UI控件又会导致FC(force close),怎么办?android提供了runOnUiThread(new Runnable())方法,只有将更新UI的操作在这个方法里执行,就可以使更新UI的事件放在main线程中执行,这样就可以避免出现FC问题.例子代码如下:
public class MainActivity extends Activity implements OnClickListener{
private TextView mTextView;
private TextView mTextView2;
Handler handler = new Handler()
{
public void handleMessage(Message msg)
{//这个方法里面的代码都是在main线程执行
Log.e("btn1OnClick", "ThreadName:" + Thread.currentThread().getName());
switch (msg.what) {
case 1:
String str2 = (String) msg.obj;
mTextView2.setText(str2);
break;
case 2:
String str1 = (String) msg.obj;
mTextView.setText(str1);
break;
default:
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("onCreate", "ThreadName:" + Thread.currentThread().getName());
findViewById(R.id.button1).setOnClickListener(this);
findViewById(R.id.button2).setOnClickListener(this);
mTextView = (TextView) findViewById(R.id.textView1);
mTextView2 = (TextView) findViewById(R.id.textView2);
}
@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:
btn1OnClick();
break;
case R.id.button2:
btn2OnClick();
break;
default:
break;
}
}
private void btn2OnClick() {
new Thread()
{
public void run()
{
Log.e("btn1OnClick", "ThreadName:" + Thread.currentThread().getName());
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String str = "从数据库得到信息";
Message msg = new Message();
msg.what = 1;
msg.arg1 = 1;
msg.arg2 = 2;
msg.obj = str;
handler.sendMessage(msg );
};
}.start();
}
private void btn1OnClick() {
new Thread()
{
public void run()
{
Log.e("btn1OnClick", "ThreadName:" + Thread.currentThread().getName());
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String str = "从服务器得到信息";
Message msg = new Message();
msg.what = 2;
msg.arg1 = 1;
msg.arg2 = 2;
msg.obj = str;
handler.sendMessage(msg );
};
}.start();
}
}
以上通过handler来传递线程的信息,使更新的UI在main线程中执行,因此避免了FC问题.
声明:以上如有问题可以联系:邮箱8848cctv@163.com 谢谢!