
质数计算
要求:
- 能够根据用户输入数字区间计算其中的所有素数;
- 要求采用多线程实现(具体实现方法不限),在计算过程中需要更新界面;
- 可以中途停止计算;
- 计算结果可以查看;
- 计算完成后需要在系统通知栏中进行通知,告知用户计算结果;
提示: - 计算素数的参考代码(非多线程)如下:
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);
}
}