【发布时间】:2018-04-23 23:54:34
【问题描述】:
我正在尝试从处理程序调用意图,但我不知道该怎么做。我尝试了许多不同的方法,但似乎没有奏效。我想在进度对话框达到最大值时启动PrimeNumbersActivity。
public class MyHandler extends Handler {
ProgressDialog progressDialog;
Context context;
public MyHandler(ProgressDialog progressDialog) {
this.progressDialog = progressDialog;
}
public MyHandler(Context context){
this.context = context;
}
@Override
public void handleMessage(Message msg) {
findPrimeNumber(Integer.parseInt(msg.obj.toString()));
}
public void findPrimeNumber(int number){
ArrayList<Integer> primeNumbers = new ArrayList<>();
boolean isPrimeNumber;
PrimeNumbers primeNumbers1 = new PrimeNumbers();
for(int i = 2; i <= number; i++){
isPrimeNumber = true;
for(int j = 1; j <= i; j++){
try {
sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(j != 1 && j != i){
if(i%j == 0){
isPrimeNumber = false;
break;
}
}
}
if(isPrimeNumber){
primeNumbers.add(i);
primeNumbers1.primeNumbers.add(i);
}
progressDialog.setProgress(i*100/number);
if(progressDialog.getProgress() == progressDialog.getMax()){
progressDialog.dismiss();
Intent intent = new Intent(context.getApplicationContext(),PrimeNumbersActivity.class);
context.startActivity(intent);
}
}
for (int i :
primeNumbers) {
Log.d(TAG, i + "");
}
}
}
PrimeNumbersActivity
public class PrimeNumbersActivity extends AppCompatActivity {
private PrimeNumbers primeNumbers = new PrimeNumbers();
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_prime_numbers);
listView = findViewById(R.id.listView);
if(primeNumbers.primeNumbers.isEmpty()){
Toast.makeText(getApplicationContext(),"Pas de nombres premiers",Toast.LENGTH_SHORT).show();
}else{
ArrayAdapter<Integer> arrayAdapter = new ArrayAdapter<Integer>(getApplicationContext(),android.R.layout.simple_list_item_1,primeNumbers.primeNumbers);
listView.setAdapter(arrayAdapter);
}
}
}
主活动
public class MainActivity extends AppCompatActivity {
public static final int number = 20;
public Button button;
public EditText editText;
public ProgressDialog progressDialog;
public AlertDialog.Builder alertDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setMax(100);
progressDialog.setMessage("Please wait...");
progressDialog.setTitle("Finding prime numbers");
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
final MyThread thread = new MyThread(progressDialog);
thread.setName("MyThread");
thread.start();
button = (Button) findViewById(R.id.afficherNombrePremier);
editText = (EditText) findViewById(R.id.editText);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(editText.getText().toString().isEmpty()){
alertDialog = new AlertDialog.Builder(MainActivity.this);
alertDialog.setTitle("Warning");
alertDialog.setMessage("Veuillez saisir un nombre entier dans la zone de texte");
alertDialog.show();
}
else{
progressDialog.show();
Message message = Message.obtain();
message.obj = editText.getText().toString();
thread.mHandler.sendMessage(message);
}
}
});
}
}
错误:
04-24 00:45:15.457 4625-4712/com.example.mohammed.tdservicesex1 E/AndroidRuntime: FATAL EXCEPTION: MyThread
Process: com.example.mohammed.tdservicesex1, PID: 4625
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
at com.example.mohammed.tdservicesex1.MyHandler.findPrimeNumber(MyHandler.java:65)
at com.example.mohammed.tdservicesex1.MyHandler.handleMessage(MyHandler.java:31)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at com.example.mohammed.tdservicesex1.MyThread.run(MyThread.java:22)
线程:
public class MyThread extends Thread {
private static final String TAG = MyThread.class.getSimpleName();
public MyHandler mHandler;
ProgressDialog progressDialog;
public MyThread(ProgressDialog progressDialog) {
this.progressDialog = progressDialog;
}
@Override
public void run() {
Looper.prepare();
mHandler = new MyHandler(progressDialog);
Looper.loop();
}
}
【问题讨论】:
-
你的代码有错误吗?
-
还有什么问题?您的代码看起来不错。
-
应用程序似乎正在运行,但是当我单击按钮执行处理程序时,应用程序崩溃并给我一个错误,我会确保将错误与类一起附加
标签: android android-intent android-handler