2012-07-19 50 views
0

我試圖創建一個基本的AsyncTask從密鑰存儲區獲取證書。Android AsyncTask ExceptionInIntilizationError

由於某種原因,即使是最簡單的AsyncTask也不適用於我,我不斷收到有關ExceptionInIntilizationError的錯誤。

這是使用只得到一個基本的AsyncTask工作的測試代碼IM:

public class Authenticator extends Activity { 

PrivateKey privateKey = null; 
String SavedAlias = ""; 

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

    getCertificates("TEST"); 

    doSomething(); 

} 

public void doSomething() 
{ 
    new additionalStuff().execute(); 
} 

public class AliasLoader extends AsyncTask<Void, Void, X509Certificate[]> 
{ 
    X509Certificate[] chain = null; 

    @Override protected X509Certificate[] doInBackground(Void... params) { 
     android.os.Debug.waitForDebugger(); 

     if(!SavedAlias.isEmpty()) 
     { 
       try { 
        chain = KeyChain.getCertificateChain(getApplicationContext(),SavedAlias); 
       } catch (Exception e) { 
        // TODO Auto-generated catch block 
       } 
     } 
     else 
     { 
      this.cancel(true); 
     } 

     return chain; 
    } 
    @Override protected void onPostExecute(X509Certificate[] chain) 
    { 
     try { 
      privateKey = KeyChain.getPrivateKey(getApplicationContext(), SavedAlias); 
     } catch (Exception e) { 
      Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show(); 
     } 

     if (privateKey != null) { 
      Signature signature = null; 
      try { 
       signature = Signature.getInstance("SHA1withRSA"); 
      } catch (NoSuchAlgorithmException e) { 
       Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show(); 
      } 
      try { 
       signature.initSign(privateKey); 
      } catch (InvalidKeyException e) { 
       Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show(); 
      } 
     } 
    } 
} 

public void getCertificates(String Host) 
{ 
    KeyChainAliasCallback callBack = new KeyChainAliasCallback() { 

     @Override 
     public void alias(String alias) { 
      if (alias != null) 
      { 
       saveAlias(alias); 
       //doSomething(); 
      } 
     } 
    }; 

    KeyChain.choosePrivateKeyAlias(this, callBack, 
    new String[] {"RSA", "DSA"}, // List of acceptable key types. null for any 
    null,      // issuer, null for any 
    null,  // host name of server requesting the cert, null if unavailable 
    443,       // port of server requesting the cert, -1 if unavailable 
    null);      // alias to preselect, null if unavailable 

} 

public void saveAlias(String alias) 
{ 
    SavedAlias = alias; 
} 

public class additionalStuff extends AsyncTask<String, String, Void> 
{ 
    String test = "This is a Test!!!"; 

    @Override 
    protected void onPreExecute() 
    { 
    } 
    @Override 
    protected Void doInBackground(String... params) { 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(String... values) 
    { 
      super.onProgressUpdate(values); 
    } 
    @Override 
    protected void onPostExecute(Void unused) 
    { 
     Log.d("DEEPAM", "THIS IS A TEST"); 
     return; 
    } 

} 
} 

爲什麼會失敗? =(

**更新** 我所做的更改添加對postexcecution的@覆蓋和參數虛空虛空,它仍然出現相同ExceptionInInitilizationError =(

** ** UPDADE

林猜我不能創建在用戶界面中,這可能是爲什麼它之前沒有使用的AsyncTask一個新的線程,反正是有,我可以得到一旦用戶選擇了證書的AsyncTask被稱爲?

+1

也許保護無效onPostExecute(Void Void)(忘記參數) – 2012-07-19 15:23:26

+0

你可以發佈stacktrace嗎?另外,請遵守命名約定,即使用'AdditionalStuff'而不是'additionalStuff'作爲類名。 – Vladimir 2012-07-20 08:34:05

+0

哦,我相信它應該是'保護無效onPostExecute(空白未使用)' – Vladimir 2012-07-20 08:35:31

回答

0

我找到了問題,whatappserv,Vladimir和n_benbourahla提到,如果我的初始錯誤得到解決,那麼稍後可能會出現問題。

本質上我忘了添加一些正在使用執行的代碼。 我在調用KeyChain.choosePrivateKeyAlias的回調函數中調用doSomething.execute()。

它看起來像把它放在外面,asynctask工作正常。

我仍然有問題,我怎樣才能調用從keychain.choosePrivateAlias回調裏面的asynctask,因爲它是唯一的,它只運行一次執行。我將用我現在擁有的更新代碼。

0

爲什麼你的onPostExecute沒有標籤「@override」和任何參數?