2017-02-22 1 views
-2

Je suis nouveau dans android et je pose une question sur mon fil que je crée. Je pense que c'est une question stupide mais je suis désolé. J'ai un écouteur de bouton onClick. Son travail consiste à obtenir le lien de téléchargement d'URL et stocke dans une variable.retarder en cours d'exécution thread

/** 
* this method invoke from setPositiveButton's dialog 
* 
* @param rootView 
*/ 
private void addURLToList(View rootView) { 

    editTextAddURL = (EditText) rootView.findViewById(R.id.editText_add_url); 

    Log.i("===", "addURLToList: " + editTextAddURL.getText()); 
    stringUrl = editTextAddURL.getText().toString(); 

    *start GetSizeOfFile thread for getting size file and store 
    * in lenghtOfFile variable 
    */ 
    new GetSizeOfFile().start(); 

    Log.i("====", "size of file after Thread: " + lenghtOfFile); 


} 

Je crée un thread parce que je veux obtenir la taille du fichier.

private class GetSizeOfFile extends Thread { 
    @Override 
    public void run() { 
     super.run(); 
     try { 
      URL url = new URL(stringUrl); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      lenghtOfFile = connection.getContentLength(); 
      Log.i("====", "size of file in Thread: " + lenghtOfFile); 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 
} 

tout est ok mais quand fil est commencé, après quelques secondes ma variable lenghtOfFile est initialisé et j'ai 0 à lenghtOfFile dans cette ligne Log.i("====", "size of file after Thread: " + lenghtOfFile); ceci est mon logcat:

02-22 10:02:11.352 11333-11333/com.example.manifest.simplefiledownloadmanager I/===: addURLToList: http://dl2.soft98.ir/soft/a/Adobe.Shockwave.Player.12.2.7.197.IE.rar 
02-22 10:02:11.352 11333-11333/com.example.manifest.simplefiledownloadmanager I/====: file name : Adobe.Shockwave.Player.12.2.7.197.IE.rar 
02-22 10:02:11.352 11333-11333/com.example.manifest.simplefiledownloadmanager I/====: size of file after Thread: 0 
02-22 10:02:36.544 11333-11495/com.example.manifest.simplefiledownloadmanager I/====: size of file in Thread: 13524394 

Je veux obtenir la taille du fichier à partir du fil premier.est-il correct que je dois dormir le fil ou quitter la voie standard? désolé je suis nouveau dans android

+0

comme d'habitude ... créer le rappel, appelez le rappel de « la fin de fil », a le personnel qui a besoin de résultats de cette discussion dans le Calback ... en attendant fil les résultats à l'intérieur de 'addURLToList' rendent Thread inutile (ouais, je connais NetworkOnMainThreadExcpetion ... mais c'est pour ça que ça a été fait ... pour ne pas bloquer le thread principal) – Selvin

+0

Je ne sais pas pourquoi certaines personnes donnent moins à un post? nouveau dans android Si vous ne voulez pas me répondre alors ne répondez pas, pourquoi donner moins !!!! –

+0

@Selvin merci. pouvez-vous envoyer un lien tutoriel sur votre chemin? –

Répondre

0

Lorsque vous travaillez avec des discussions, vous ne pouvez pas assumer leur ordre d'exécution. Ce qui se passe dans votre cas Je suppose que pendant que votre nouveau thread attend que la connexion soit établie, le thread d'origine est exécuté avec la variable lenghtOfFile non initialisée, ce qui fait que le journal ressemble à cela. Une autre possibilité est que le nouveau thread n'a même pas commencé à s'exécuter lorsque la ligne lenghtOfFile=0 a été enregistrée. C'est juste comment les threads fonctionnent.

Pour ce but, la classe ASyncTask existe sous Android. Votre code devrait être un peu comme ceci:

private class GetSizeOfFile extends AsyncTask<String, Void, Long> { 

    // runs on a background thread 
    protected Long doInBackground(String... stringUrls) { 
     String stringUrl = stringUrls[0]; 
     try { 
      URL url = new URL(stringUrl); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      long lenghtOfFile = connection.getContentLength(); 
      return lenghtOfFile; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return -1; 
    } 

    // runs on main thread 
    protected void onPostExecute(Long lenghtOfFile) { 
     if (lenghtOfFile == -1) { 
      // something went wrong 
     } else { 
      Log.i("====", "size of file: " + lenghtOfFile); 
      // whatever else you want to do 
     } 
    } 
} 

new GetSizeOfFile().execute(stringUrl);