La suspension de tous les threads ont pris: ms avertissement l'utilisation de Threads - Android
J'ai 2 Thread
s qui font qu'une partie du réseau de calcul.
Quand je lance mon appli et après le démarrage de mon deuxième Thread
- je obtenir un:
Suspending all threads took: ms
avertissement suivi par:
Background sticky concurrent mark sweep GC freed 246745(21MB) AllocSpace objects, 169(6MB) LOS objects, 33% free, 31MB/47MB, paused 1.972ms total 127.267ms
avertissement.
Parfois, j'ai juste ces 2 mises en garde et d'autres fois, je reçois beaucoup de ces 2 mises en garde jusqu'à ce que je décide de mettre fin à l'application en cours d'exécution. À ce stade, c'est juste la course de la principale Thread
et, fondamentalement, ne rien faire. Voici le code correspondant:
MainActivity.java:
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Getting html page through a thread
this.getHtmlPageThread = new GetHtmlPageThread(URL_STRING);
this.getHtmlPageThread.start();
//The thread that will search the web for data
this.getDataFromTheWebThread = new GetDataFromTheWebThread();
//Search button click listener
searchButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
//Get the searched lyrics
searchedLyrics = inputEditText.getText().toString();
informUserAboutConnectionToTheNet();
//Starting to search the web for data through a thread
getDataFromTheWebThread.start();
if (!getDataFromTheWebThread.isAlive())
{
printMap(MainActivity.matchResultMap);
}
}
}); //End of search button click listener
printMap(MainActivity.matchResultMap);
} //End of onCreate() method
protected void onStart()
{
super.onStart();
if (!this.isParseSucceeded()) //Connection to net failed
{
if (!getHtmlPageThread.isAlive()) //If the thread is not alive, start it.
{
getHtmlPageThread.start(); //Try to connect again
this.informUserAboutConnectionToTheNet();
}
}
if (!this.isParseSucceeded())
{
super.onStart(); //Call onStart() method
}
} //End of onStart() method
GetHtmlPageThread.java:
public class GetHtmlPageThread extends Thread
{
private String url;
public GetHtmlPageThread(String url)
{
this.url = url;
}
@Override
public void run()
{
try
{
MainActivity.htmlPage.setHtmlDocument(this.getParsedDocument(this.url));
if (MainActivity.htmlPage.getHtmlDocument() != null)
{
MainActivity.parsedSucceeded = true; //Parsed succeeded
}
else
{
MainActivity.parsedSucceeded = false; //Parsed failed
}
Thread.sleep(100);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
/**
* Returns the document object of the url parameter.
* If the connection is failed , return null.
*
* @param url Url to parse
* @return The document of the url.
*
*/
public Document getParsedDocument(String url)
{
try
{
return Jsoup.connect(url).get();
}
catch (IOException e) //On error
{
e.printStackTrace();
}
return null; //Failed to connect to the url
}
}
GetDataFromTheWeb.java:
public class GetDataFromTheWebThread extends Thread
{
public static boolean isFinished = false; //False - the thread is still running. True - the thread is dead
@Override
public void run()
{
GetDataFromTheWebThread.isFinished = false;
try
{
this.getLyricsPlanetDotComResults(MainActivity.searchedLyrics); //Method for internet computations
Thread.sleep(100);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
GetDataFromTheWebThread.isFinished = true;
}
...
}
Fondamentalement la this.getLyricsPlanetDotComResults(MainActivity.searchedLyrics);
méthode dans la deuxième Thread
est de faire beaucoup de travail sur l'internet et les calculs en général. Plus de calculs que le net des trucs pour être exact.
Donc je suppose que j'ai reçu ces avertissements, car la deuxième Thread
est trop "Occupé"? Ou peut-être juste ma mise en œuvre avec l'activité du cycle de vie avec le onCreate()
méthode et onStart()
méthode sont mauvais?
Inutile de dire que je ne suis pas d'obtenir le résultat que je veux, si je déboguer l'application et traversai le deuxième Thread
et il fonctionne Parfaitement. Encore une fois, ce doit être quelque chose avec mon Activity
mise en œuvre.
OriginalL'auteur God | 2016-04-15
Vous devez vous connecter pour publier un commentaire.
La première ligne est essentiellement à dire que le garbage collector (GC) a décidé de la nécessité de suspendre tous les threads pour faire partie de son travail (telles que le déplacement, les variables) et qui a pris un certain temps. Normalement il y a un certain nombre.
La deuxième ligne est le résultat de la collecte. Elle a libéré une bonne quantité de mémoire, et vous avez maintenant de 1/3 de votre tas gratuit. C'nécessaires à votre application d'être en pause pendant 2 ms, et en total dépensé 127 ms, la collecte des ordures.
GC en soi n'est pas mauvaise. Mais si vous le faites tout le temps, soit vous êtes en train de faire quelque chose avec beaucoup de mémoire requise ou que vous êtes en train de faire quelque chose de façon inefficace. Lourde chaîne d'analyse, surtout pour quelque chose comme JSoup, peut causer beaucoup de petits objets (principalement des chaînes de caractères) que vraiment nécessaire de nettoyage rapidement sur une petite mémoire de l'appareil comme un téléphone, de sorte qu'il n'est pas étonnant de voir ici.
En gros, c'est seulement un problème si vous êtes obtenir des performances hoquet de GC ou si vous allez OOM à un certain point. Si aucune de ces sont en train d'arriver, je ne voudrais pas vous inquiéter à ce sujet encore.
Thread
est en train de faire exactement ce que je veux(**pour mettre À jour une variable globale dansMainActivity.java
) , je ne sais pas quand je peux y accéder(Lorsque leThread
est fait, C'est le travail) et comment(Parce que j'ai besoin d'uneLoop
comme celle -while (!myThread,isAlive()) {//Do my work}
, mais c'est une bonne mise en œuvre? Aussi, je thogh sur la modification de laThread
àHandlerThread
developer.android.com/intl/zh-cn/reference/android/os/... . Qu'en pensez-vous? Merci.Si vous avez besoin de savoir quand le thread est fait, utiliser un callback (ou si vous avez besoin d'un avis sur le thread d'INTERFACE utilisateur, un rappel fait à partir d'un Gestionnaire sur le thread d'INTERFACE utilisateur). HandlerThread est plus pour un thread où vous allez envoyer une série d'événements qu'il a à répondre.
stackoverflow.com/questions/19366301/... comme ici?
Ou ici stackoverflow.com/questions/3398363/...?
OriginalL'auteur Gabe Sechan