2012-07-19 51 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”和任何参数?