android - 进展黑了但仍在运行

时间:2013-10-05 08:04:51

标签: android progressdialog

我正在Android平台上开发DES解密。

这是我的主要

package com.example.crack;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;

public class Main extends Activity {

    public final static String EXTRA_MESSAGE = "com.example.crack.MESSAGE";
    public final static String EXTRA_PLAINTEXT = "com.example.crack.PLAINTEXT";
    public final static int ENCRYPTION_REQUEST = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
    }

    @Override
    public 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;
    }

    public void sendMessage(View view) {
        Intent intent = new Intent(this, encryption.class);
        EditText editText = (EditText) findViewById(R.id.input_message);
        String message = editText.getText().toString();
        intent.putExtra(EXTRA_MESSAGE, message);
        startActivityForResult(intent, ENCRYPTION_REQUEST);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // Check which request it is that we're responding to
        if (requestCode == ENCRYPTION_REQUEST) {
            // Make sure the request was successful
            if (resultCode == RESULT_OK) {
                String result = data.getStringExtra(encryption.EXTRA_ENCRYPTION_RETURN);

                Intent intent = new Intent(this, DisplayMessage.class);
                intent.putExtra(EXTRA_MESSAGE, result);
                startActivity(intent);
            }
        }
    }
}

这是我加密的部分内容

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

    Intent intent = getIntent();
    message = intent.getStringExtra(Main.EXTRA_MESSAGE);

    //Dictionary
    is = getResources().openRawResource(R.raw.english);
    in = new BufferedReader(new InputStreamReader(is));
    readDic();

    String result = "";
    try {
        result = decryptBruteForce();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    Intent returnIntent = new Intent();
    returnIntent.putExtra(EXTRA_ENCRYPTION_RETURN,result);
    setResult(RESULT_OK,returnIntent);     
    finish();

}

当我点击按钮时,它调用sendMessage函数,当它正在运行解密时,屏幕只是黑屏,直到它完成运行。

我尝试使用进度条跟随此guide,但无法正常工作,我需要一个可以在运行时停止进程的按钮。

是否可以设置一个登录视图,它显示了该功能现在正在做什么?喜欢IDE日志中显示的内容?例如,显示正在尝试解密的密钥。

或者只是一个进度条,或者请等一下。

我尝试将sendMessage更改为此,但它仍然黑屏并崩溃

public void sendMessage(View view) {
        final Intent intent = new Intent(this, encryption.class);
        view.setEnabled(false);
        AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {

            @Override
            protected void onPreExecute() {
                pd = new ProgressDialog(context);
                pd.setTitle("Processing...");
                pd.setMessage("Please wait.");
                pd.setCancelable(false);
                pd.setIndeterminate(true);
                pd.show();
            }

            @Override
            protected Void doInBackground(Void... arg0) {
                try {
                    //Do something...

                    EditText editText = (EditText) findViewById(R.id.input_message);
                    String message = editText.getText().toString();
                    intent.putExtra(EXTRA_MESSAGE, message);
                    startActivityForResult(intent, ENCRYPTION_REQUEST);

                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onPostExecute(Void result) {
                if (pd!=null) {
                    pd.dismiss();
                    b.setEnabled(true);
                }
            }

        };
        task.execute((Void[])null);
    }

如果我把睡眠放到50000,它没有崩溃,但仍然是黑屏。

1 个答案:

答案 0 :(得分:1)

您可以使用线程和处理程序执行此操作。尝试每种组合时,都会更新进度条。

private int mProgressStatus = 0;
private Handler mHandler = new Handler();

protected void onCreate(Bundle savedInstanceState)     
{    
    .... // Other initializations

mProgress = (ProgressBar) findViewById(R.id.progress_bar);
mProgress.setMax(dictionaryLength);

// Start lengthy operation in a background thread
new Thread(new Runnable() {
 public void run() {
     for (int i=0 ; i<dictionaryLength ; i++)
     {
         mProgressStatus = decryptBruteForce(i);

         // Update the progress bar
         mHandler.post(new Runnable() {
             public void run() {
                 mProgress.setProgress(mProgressStatus);
             }
         });
     }
 }
}).start();
}

但是,我建议您使用AsyncTask进行后台操作,同时需要更新UI以显示正在进行的进度或信息。

http://developer.android.com/intl/es/reference/android/os/AsyncTask.html

在循环中添加取消控件是一个好习惯,因此您可以从AsyncTask外部完成它(例如您的UI中的另一个按钮)。

private class DecryptTask extends AsyncTask<String, Integer, Long> {  
 protected Long doInBackground(String... words)   
 {   
     long wordsDecrypted = 0;   
     for (int i = 0; i < words.length ; i++) {   
         wordsDecrypted += decryptBruteForce(i);   
         publishProgress(i);   

        // Escape early if cancel() is called
         if (isCancelled()) 
            break;
     }
     return wordsDecrypted;
 }

 protected void onProgressUpdate(Integer... progress) {
     mProgress.setProgress(progress[0]);
 }

 protected void onPostExecute(Long result) {
     showDialog("Decrypted " + result + " words");
 }
}

您可以使用cancel方法从外部取消AsyncTask:

http://developer.android.com/intl/es/reference/android/os/AsyncTask.html#cancel(boolean)

PD:未对代码进行测试,仅举例说明其工作原理