Quelques petites erreurs avec ceci. Tout d'abord, vous ne devez JAMAIS toucher les éléments d'interface utilisateur d'un sujet que vous avez créé.
Vous aurez besoin pour Handlers fait connaissance d'fil: http://developer.android.com/reference/android/os/Handler.html
La façon dont ils travaillent est, vous les initialisez dans votre thread d'interface utilisateur normale. (le thread votre méthode onCreate() est appelée.) Les gestionnaires, sont des objets thread-safe que vous étendez pour communiquer entre les threads.
Ainsi, sur votre onCreate(): méthode
Handler pHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
Bundle bundle = msg.getData();
int msg_type = bundle.getInt("TYPE");
if (msg_type == MyThread.ERROR_MSG)
{
///SOMETHING HAPPENED
return;
}
else
{
//background task finished ok
}
}
};
Puis, à partir de votre run() vous envoyer un message en utilisant un objet Bundle et le message. http://developer.android.com/reference/android/os/Bundle.html et http://developer.android.com/reference/android/os/Message.html
La façon dont je tiens à le faire, de garder les choses propres est d'étendre la classe Thread pour ajouter un peu de cohérence ...
class MyThead extends Thread
{
public final int ERROR_MSG = 0;
public final int OK_MSG = 1;
Handler mHandler;
MyThread(Handler pHandler)
{
mHandler = pHandler;
}
@Override
public void run()
{
//send a message back to the ui thread....
Message msg = new Message();
Bundle bundle = new Bundle();
bundle.putInt("TYPE", OK_MSG);
msg.setData(bundle);
mHandler.sendMessage(msg);
}
}
si vous voulez obtenir un peu fantaisie, vous séparez complètement le code de l'interface utilisateur et le code du thread de travail. Si votre tâche d'arrière-plan ne sera pas longue, vous pouvez exécuter runonUiThread() comme décrit précédemment.
Vous pouvez également utiliser AsyncTask, voir: http://developer.android.com/reference/android/os/AsyncTask.html
Voici un exemple de leur page, son utilisation est assez simple:
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i/(float) count) * 100));
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
Finalement, cependant, ces approches ne sont pas parfaits si la l'utilisateur change d'orientation lorsque votre tâche est en cours d'exécution. (ou si votre activité est supprimée pour toute autre raison.) Dans ce cas, vous devez configurer un service: http://developer.android.com/reference/android/app/Service.html
Dans votre capture, placez e.printStackTrace(). Cela vous donnera le numéro de ligne sur lequel l'erreur est. Cela vous donnera plus d'informations au moins. – skorulis
Que diriez-vous de Log.i ("Demo", "Demo - Demo Exception", e); donc nous pouvons réellement voir quelle est l'exception et vous dire ce qui ne va pas? – EboMike
@Skorulis @EboMike j'ai téléchargé l'image de "Log", s'il vous plaît vérifier et me donner des suggestions que vous pouvez ... merci pour le commentaire –