浅析线程的基本使用(2)

来源:互联网 发布:linux误删除文件夹恢复 编辑:程序博客网 时间:2024/05/20 17:08

ANR:Application not responding,即程序在触碰五秒后无响应则弹出对话框,询问用户是否退出程序。

有时候屏幕刷新与监听器代码在主线程中同时执行即会出现这种情况,例如一个需要网络环境的应用,有一个下载的按钮,监听器事件为从服务器下载内容,下载完成后刷新界面。若是网络环境不好,下载的进度很慢,屏幕迟迟得不到刷新,用户触碰屏幕后则会出现ANR情况。为了避免这种情况,开发往往将会为监听器事件新建一个线程,使主线程能够及时的响应用户。

下面创建一个计算水仙花数的应用来说明下如何为监听器事件开辟线程。

首先界面创建一个editText,一个Button和一个TextView。editText用于输入数字n,默认范围为0至n。点击Button后进行水仙花数的计算,计算完成后TextView将所有水仙花数显示出来。

public class MainActivity extends Activity {    private Button bt;    private TextView tv;    private EditText et;    private ProgressDialog dialog;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);setView();setListeners();}     private void setListeners() {// TODO Auto-generated method stub    /**     * 设置监视器代码,执行计算操作     */bt.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubcalculate();}});}    protected void calculate(){    dialog.show();//显示一个正在加载的对话框    new Thread(){    //开辟线程执行run()方法,计算水仙花数    public void run(){    int n = Integer.parseInt(et.getText().toString());    final StringBuilder sb = new StringBuilder();    //计算水仙花数    for (int i = 10; i <= n; i++) {int w = String.valueOf(i).length();int sum = 0;for(int j = i;j != 0; j /= 10){int y = j%10;sum += Math.pow(y,w);}if (sum == i) {sb.append(i+"\n");}}    //刷新屏幕    Handler h = new Handler(Looper.getMainLooper());    h.post(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubtv.setText(sb.toString());dialog.dismiss();}});    }    }.start();    }    //设置界面属性private void setView() {// TODO Auto-generated method stubet = (EditText)findViewById(R.id.editText1);bt = (Button)findViewById(R.id.button1);tv = (TextView)findViewById(R.id.textView1);//设置一个对话框,用于在应用进行计算时显示dialog = new ProgressDialog(this);dialog.setMessage("正在计算");dialog.setCancelable(false);}@Overridepublic 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;}}
主要代码如上。

效果如下:

输入数字后,点击按钮,计算过程中弹出对话框

这样屏幕刷新事件也得以进行,不会出现ANR情况了。

0 0
原创粉丝点击