Android 事件处理之使用新线程计算质数

该示例允许用户输入一个数字,从而计算该数字范围内的质数,每一步的代码都要详细标注,直接上源码。

1.MainActivity:

package com.example.newhandler;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends Activity {
    static final String UPPER_NUM = "upper";
    EditText input;
    CalThead calThead;

    //定义一个线程类
    class CalThead extends Thread{
        public Handler mHandler;
        public void run(){
            //创建Looper对象,同时创建MessageQueue
            Looper.prepare();
            mHandler = new Handler(){
                @Override
                public void handleMessage(Message msg) {
                    if (msg.what == 0x123){
                        List nums = new ArrayList<>();
                        //从UI线程(EditText)中或者数值
                        int upper = msg.getData().getInt(UPPER_NUM);
                        //从2开始,到upper的所有质数
                        //outer就是一个标签,java语言中根本没有此关键字,因此outer也可以用其它的词来代替
                        // 当程序从外层循环进入内层循环后,当(i != 2 && i % j ==0)时,程序遇到一个continue outer;语句,
                        // 这行代码将会导致继续outer标签指定的外层循环,而不是继续continue所在的循环
                        outer:
                        for (int i = 2 ; i <= upper ; i++){
                            //用i除以2开始,到i的平方根的所有数
                            for (int j = 2 ; j <= Math.sqrt(i) ; j++){
                                //如果可以整除,则表明这个数不是质数
                                if (i != 2 && i % j ==0){
                                    continue outer;
                                }
                            }
                            nums.add(i);
                        }
                        Toast.makeText(MainActivity.this,nums.toString(),Toast.LENGTH_SHORT).show();
                    }
                }
            };
            //启动Looper
            Looper.loop();
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        input = findViewById(R.id.input);
        calThead = new CalThead();
        //启动线程
        calThead.start();
    }
    public void cal(View view){
        Message msg = new Message();
        msg.what = 0x123;
        Bundle bundle = new Bundle();
        bundle.putInt(UPPER_NUM , Integer.parseInt(input.getText().toString()));
        msg.setData(bundle);
        calThead.mHandler.sendMessage(msg);
    }
}

2.XML:




    
    

你可能感兴趣的:(Android 事件处理之使用新线程计算质数)