3

J'ai déjà rencontré this error, mais j'ai pensé que c'était une erreur du système en mode strict. Cependant, il était apparemment juste comme je l'ai malheureusement découvert maintenant. . :(Android Honeycomb: Fragment impossible de démarrer AsyncTask?

Mon programm est fait d'une activité et des charges de fragments I ont un fragment NetworkWorker, qui commence requêtes d'URL comme ceci:

public void startURLRequest(Fragment target, String url, String message) 
{ 

    if (asyncTask != null) asyncTask.cancel(true); 
    asyncTask = new FragmentHttpHelper(url, message, target); 
    asyncTask.doInBackground(); 

    return; 
} 

FragmentHttpHelper est une classe personnalisée intérieure dérivée de AsyncTask:

private class FragmentHttpHelper extends AsyncTask<Void, Void, String> 
{ 
    //... 

    @Override 
    protected String doInBackground(Void... params) 
    { 

     if (CheckInternet()) 
     { 
      try 
      { 
       URL myURL = new URL(url); 
       httpClient = new DefaultHttpClient(); 

       if (this.message == null) 
       { 
        httpRequest = new HttpGet(myURL.toExternalForm()); 
       } 
       else 
       { 
        httpRequest = new HttpPost(myURL.toExternalForm()); 

        HttpEntity myEntity = new StringEntity(message, "UTF-8"); 
        ((HttpPost) httpRequest).setEntity(myEntity); 
       } 

       // and so on... 
      } 
      //catches 
      finally 
      { 
       // auf jeden Fall Verbindung beenden 
       if (httpRequest != null) httpRequest.abort(); 
       // if (httpClient != null) httpClient.close(); 
      } 

     } 
     else 
     { 
      showDialog(getString(R.string.net_notify_no_network), target); 
     } 

     //... 
    } 

    /** 
    * gets called after AsyncTask has finished 
    */ 
    protected void onPostExecute(String result) 
    { 

     if (target == null) 
     { 
      ((NetworkWorkerListener) getActivity()).onDownloadHasFinished((!result.contentEquals(ERROR)), result); 
     } 
     else 
     { 
      ((NetworkWorkerListener) target).onDownloadHasFinished((!result.contentEquals(ERROR)), result); 
     } 
    } 

} 

NetworkWorkerListener est juste une interface pour un rappel sur le fragment qui a commencé la demande d'URL. Cette classe a toujours bien fonctionné quand je l'ai utilisé dans mon application 2.2. Je tireraient dans mes activités alors.

Maintenant, si un élément de menu est sélectionné, un autre travailleur Fragment commence la demande d'URL via la méthode ci-dessus et ouvre une boîte de dialogue de chargement:

FragmentManager fragmentManager = getFragmentManager(); 

NetworkWorker network = (NetworkWorker) fragmentManager.findFragmentByTag(TabletMain.NETWORK); 
if (network == null) return WorkerFeedback.NO_NETWORK_WORKER; 

myDialog = LoadingDialog.createInstance(getString(R.string.notify_download), this); 
myDialog.show(fragmentManager, TabletMain.ONETIME); 

network.startURLRequest(this, someurl, null); 

Au moins ce que censé se produire. Au lieu de cela, lorsque je clique sur l'élément de menu, mon application se bloque et aucune boîte de dialogue de chargement n'est affichée jusqu'à ce que. Prochain passe est la réaction à la fin du téléchargement (ou, dans mon cas, un message d'erreur, car j'envoie des chaînes de non-sens). Signification onPostExecute() a été atteint.

Je me sens vraiment coincé maintenant - n'est-il pas possible d'utiliser AsyncTask avec Fragments? Ou ai-je fait quelque chose de mal?

Merci pour votre aide, méduses

+0

Avez-vous vérifié la sortie de chat de journal? – Flo

+0

Il y a seulement une exception que j'attrape et j'imprime moi-même dans le journal. – jellyfish

Répondre

7

Ne pas appeler doInBackground directement, appelez execute à la place (la tâche async)

+1

Oooooh, je suis tellement bête, merci! J'aurais dû regarder de plus près mon application Smartphone. ;) – jellyfish

Questions connexes