0

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 関数が呼び出されます。復号化の実行中は、実行が完了するまで画面が真っ暗になります。

このガイドに従って進行状況バーを使用してみましたが、機能しません。実行中にプロセスを停止できるボタンが必要です。

また、関数が現在何をしているかを示すログオンビューを設定することは可能ですか? 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にすると、クラッシュしませんでしたが、それでもブラックアウトします。

4

1 に答える 1

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();
}

ただし、UI を更新して進行状況や進行中の情報を表示する必要がある間は、AsyncTask を使用してバックグラウンド操作を行うことをお勧めします。

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(ブール値)

PD: コードはテストされていません。コードがどのように機能するかを示すための例です。

于 2013-10-05T08:48:52.570 に答える