2013-10-05 4 views
0

Я разрабатываю дешифрование DES в платформе Android.android - прогресс черный, но все еще работает

это мой главный

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

и это частичное моей encrpytion

@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, он не разбился, но все-таки это затемнение.

+0

и что ваш журнал шоу кошки на крахе приложения? –

ответ

1

Вы можете сделать это с помощью Thread and Handler. Во время каждой комбинации вы обновляете индикатор выполнения.

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 делать фоновые операции в то время как вам необходимо обновить пользовательский интерфейс, чтобы показать прогресс или информацию о, что происходит.

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

И вы можете отменить AsyncTask снаружи с помощью метода CANCEL:

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

PD: Коды не испытывалась, только примеры, чтобы показать, как это работает

Смежные вопросы