android的线程和进程

进程简单的理解就是:启动一个应用就是一个进程.每个应用有可能多个线程.如果一个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问题.

声明:以上如有问题可以联系:邮箱[email protected] 谢谢!







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章