Anwendung hängt sich auf und unterbricht alle threads, die während der Verwendung von AsyncTask
Ich versuche, mit der AsyncTask
Klasse, um eine website mit dem content. Die logcat sagt mir W/art: Suspending all threads took: 15(or any other number)ms
wiederholt. Meine Anwendung ist eingefroren, bis die log-Meldungen werden nach dem drucken. UI zeigt sich nach der Anmeldung erfolgt. Ich folgte ein tutorial und haben doppelt überprüft, dass mein code sollte die gleiche sein, wie das tutorial. Nach einer Weile, meldet es sich mit ein paar Zeilen code von der website, aber nichts mehr. Ich habe versucht, mit verschiedenen websites als auch. Hier ist mein AsyncTask:
public class MainActivity extends AppCompatActivity {
public class DownloadTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
String result = "";
URL url;
HttpURLConnection urlConnection = null;
try {
url = new URL(urls[0]);
urlConnection = (HttpURLConnection) url.openConnection();
InputStream in = urlConnection.getInputStream();
InputStreamReader reader = new InputStreamReader(in);
int data = reader.read();
while (data != -1) {
char current = (char) data;
result += current;
data = reader.read();
}
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
DownloadTask task = new DownloadTask();
String result = null;
try {
result = task.execute("http://www.vg.no/").get();
Log.i("URL content" , result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die folgende Zeile ein problem:
result = task.execute("http://www.vg.no/").get();
Den
.get()
Teil dieser Aussage bedeutet "warten Sie, bis der Vorgang abgeschlossen ist". Dies blockiert den UI thread während der task ausgeführt wird.Nur lassen Sie die hintergrund-task seine Sachen und erhalten Sie keine Ergebnisse über
onPostExecute()
. Schauen Sie sich die folgenden AsyncTask:Zuerst denke ich, dass Sie missbraucht AsyncTask. AsyncTask sollte verwendet werden, asynchron, nicht synchron mit get().
sollten Sie onPostExecute in Ihrem AsyncTask und erhalten das Ergebnis da.
Könnten Sie besser Lesen tutorial hier ->
http://developer.android.com/reference/android/os/AsyncTask.html
Haben Sie eine bessere alternative zu AsyncTask.
Vom "Threading-Leistung" Artikel von developer.android.com:
Können Sie HandlerThread als alternative. Wenn Sie viele URLs abgerufen werden, gehen Sie für ThreadPoolExecutor
Haben Sie einen Blick auf post(s):
Hf vs AsyncTask vs Thread
Ich hab das gleiche problem in einer solchen Weise. "während" ist der Grund des Problems ist, müssen Sie es loswerden.