Android第二次测试 - 2

质数计算

要求:

  1. 能够根据用户输入数字区间计算其中的所有素数;
  2. 要求采用多线程实现(具体实现方法不限),在计算过程中需要更新界面;
  3. 可以中途停止计算;
  4. 计算结果可以查看;
  5. 计算完成后需要在系统通知栏中进行通知,告知用户计算结果;
    提示:
  6. 计算素数的参考代码(非多线程)如下:
for (int i=begin; i<=end; i++) {          
   boolean isPrime=true;     
        for (int j=2; j< i; j++) {     
            if(i%j==0) isPrime=false;    
         }        
     if (isPrime){         
       //i是素数        
     } }

显示通知的步骤:
( 1) 创建通知频道channel(Android API 26以上);
( 2) 创建通知;
( 3) 发布通知,方法如下;
mNotifyManager = (NotificationManager)getSystemService(NOTIFICATION_mNotifyManager.notify(NOTIFICATION_ID, myNotification);

MainActivity.java

package com.example.wg2016110137;

import android.app.AlertDialog;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "wg2016110137wg";
    private EditText editText_start;
    private  EditText editText_end;
    private Button button_start;
    private  Button button_end;
    public TextView textView_all;
    final static String myChannel = "wg";
    NotificationCompat.Builder builder;
    public int p=0;
    MyAsyncTask task;
    public ArrayList<String> arrayList = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }
    public void init(){
        editText_start=findViewById(R.id.editText_start);
        editText_end=findViewById(R.id.editText_end);
        button_start=findViewById(R.id.button_start);
        editText_start=findViewById(R.id.editText_start);
        editText_end=findViewById(R.id.editText_end);
        button_end=findViewById(R.id.button_end);
        textView_all=findViewById(R.id.textView_all);
        button_start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String wgstart = editText_start.getText().toString();
                int start = Integer.valueOf(wgstart);
                String wgend = editText_end.getText().toString();
                int end = Integer.valueOf(wgend);
                if(start>end){
                    showDialog();
                    return;
                }
                task = new MyAsyncTask();
                task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
            }
        });
        button_end.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(task!=null && !task.isCancelled() && task.getStatus()==AsyncTask.Status.RUNNING){
                    task.cancel(true);
                    task=null;
                }
            }
        });
    }
    class MyAsyncTask extends AsyncTask<Integer,Integer,Integer>{
        //后台执行的 最耗时间的
        @Override
        protected Integer doInBackground(Integer... integers) {
            String wgstart = editText_start.getText().toString();
            int start = Integer.valueOf(wgstart);
            String wgend = editText_end.getText().toString();
            int end = Integer.valueOf(wgend);
            Log.d(TAG, "wgstart: "+start+" "+end);
            p=1;
            arrayList.clear();
            for (int i=start; i<=end; i++) {
                boolean isPrime=true;
                for (int j=2; j< i; j++) {
                    if(i%j==0) isPrime=false; }
                if (isPrime){ //i是素数
                    arrayList.add("第"+p+"个素数是:   "+i);
                    publishProgress(p);
                    p++;
                }
            }
//            Log.d(TAG, "onClick: "+arrayList.get(0));
            return p;
        }
        //执行过程中
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            textView_all.setText("算出 "+values[0]);
         //   Log.d(TAG, "onProgressUpdate: "+values[0]);
            if(isCancelled()){
                Log.d(TAG, "onProgressUpdate: "+"已停止");
                return;
            }
        }
        //执行完毕后
        @Override
        protected void onPostExecute(Integer integer) {
            super.onPostExecute(integer);
            integer--;
            textView_all.setText("总数="+integer);
            TiShi("总数=" + integer+"个素数");
        }

        @Override
        protected void onCancelled() {
            super.onCancelled();
        }
    }
    public void wggo(View v){
        Intent intent = new Intent(this,HistoryActivity.class);
        intent.putStringArrayListExtra("history",arrayList);
        startActivity(intent);
    }
    //参考:https://blog.csdn.net/u010356768/article/details/83382446
    public void TiShi(String string){
        //获取NotificationManager实例
        NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {

            NotificationChannel channel = new NotificationChannel(myChannel,"myChannel",NotificationManager.IMPORTANCE_DEFAULT);
            manager.createNotificationChannel(channel);
            //实例化NotificationCompat.Builde并设置相关属性
            builder = new NotificationCompat.Builder(this,myChannel);
            //设置小图标
            builder.setSmallIcon(R.mipmap.ic_launcher);
            //设置标题内容
            builder.setContentTitle("您好:").setContentText(string);
            //发送意图
            Intent intent = new Intent(this,MainActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_CANCEL_CURRENT);
            builder.setContentIntent(pendingIntent);
            //发送通知
            manager.notify(1,builder.build());
        }
    }

    //  原文:https://blog.csdn.net/kmoonsl/article/details/80702216
    private void showDialog(){
        AlertDialog.Builder builder=new AlertDialog.Builder(this);
        builder.setTitle("您好!");
        builder.setMessage("输入有误");
        builder.setPositiveButton("确定",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {

                    }
                });
        AlertDialog dialog=builder.create();
        dialog.show();
    }
}

HistoryActivity.java

package com.example.wg2016110137;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;

public class HistoryActivity extends AppCompatActivity {
    ArrayList<String> arrayList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_history);

        Intent intent = getIntent();
        arrayList = intent.getStringArrayListExtra("history");
        final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,arrayList);
        ListView listView = findViewById(R.id.listview);
        listView.setAdapter(arrayAdapter);
    }
}

xml文件 略

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容