Java-Can ' T create handler inside thread, der nicht genannt Looper.prepare()
Sah ich die meisten der Fragen, aber ich konnte nicht finden, dass mein problem behoben.
Dies ist mein code, und ich habe keine Ahnung, was ich falsch mache.
static class NamedFile {
public File f;
public String name;
public String ext;
public String path;
public BitmapDrawable icon;
public NamedFile (File file) {
f = file;
name = f.getName();
if (f.isFile()) {
if (name.indexOf('.') != -1) {
ext = name.substring(name.lastIndexOf('.') + 1).trim().toLowerCase();
} else {
ext = "unknown";
}
}
path = f.getAbsolutePath();
if (ext == null) {
icon = mFolderIcon;
} else {
BitmapDrawable i = icons.get(ext);
if (i == null) {
try {
int rid = R.drawable.class.getField(ext).getInt(R.drawable.class);
icons.put(ext, new BitmapDrawable(Bitmap.createScaledBitmap(BitmapFactory.decodeResource(res, rid, mOpts), iconSize, iconSize, false)));
icon = icons.get(ext);
} catch (Exception e1) {}
} else {
icon = i;
}
}/* else if (ext.equals("jpeg") || ext.equals("jpg") || ext.equals("bmp") || ext.equals("gif") || ext.equals("png")) {
Bitmap b = BitmapFactory.decodeFile(path, mOpts);
if (b != null) {
icon = new BitmapDrawable(Bitmap.createScaledBitmap(b, iconSize, iconSize, false));
}
}*/
if (ext != null && (ext.equals("jpeg") || ext.equals("jpg") || ext.equals("bmp") || ext.equals("gif") || ext.equals("png"))) {
/*
Bitmap b = BitmapFactory.decodeFile(path, mOpts);
if (b != null) {
icon = new BitmapDrawable(Bitmap.createScaledBitmap(b, iconSize, iconSize, false));
}
*/
final Handler handler = new Handler() {
@Override
public void handleMessage(Message message) {
HashMap<String, Object> m = ((HashMap<String, Object>)message.obj);
sendThumbnail ((String)m.get("path"), (byte[])m.get("data"));
}
};
Thread thread = new Thread() {
public void writeInt (byte[] buff, int pos, int value) {
buff[pos] = (byte)(value >>> 24);
buff[pos + 1] = (byte)(value >>> 16);
buff[pos + 2] = (byte)(value >>> 8);
buff[pos + 3] = (byte)value;
}
@Override
public void run() {
try {
Bitmap b = BitmapFactory.decodeFile(path, mOpts);
if (b.getHeight() > 256 || b.getWidth() > 256) {
float r;
if (b.getHeight() > b.getWidth()) {
r = 128f / b.getHeight();
} else {
r = 128f / b.getWidth();
}
b = Bitmap.createScaledBitmap(b, (int)(r * b.getWidth()), (int)(r * b.getHeight()), false);
byte[] buffer = new byte[b.getWidth() * b.getHeight() * 4 + 8];
writeInt (buffer, 0, b.getWidth());
writeInt (buffer, 4, b.getHeight());
int i = 8;
for (int y = 0; y < b.getHeight(); y ++) {
for (int x = 0; x < b.getWidth(); x ++) {
writeInt (buffer, i, b.getPixel(x, y));
i += 4;
}
}
HashMap<String, Object> msg = new HashMap<String, Object>();
msg.put("path", path);
msg.put("data", buffer);
Message message = handler.obtainMessage(1, msg);
handler.sendMessage(message);
}
} catch (Exception e) {
sendLog (e.toString());
}
}
};
thread.start();
}
if (icon == null) {
icon = mFileIcon;
}
}
public NamedFile () {
}
public NamedFile simpleClone () {
final NamedFile nf = new NamedFile();
nf.name = name;
nf.ext = ext;
nf.path = path;
return nf;
}
}
Dies ist verschachtelt innerhalb einer if-Anweisung, die in einer statischen Klasse' Konstruktor-Funktion und die statische Klasse in eine öffentliche Klasse extends ListActivity. Ich bin neu in Java.
Fehler:
05-01 20:21:58.810: E/AndroidRuntime(584): Uncaught handler: thread AsyncTask #1 exiting due to uncaught exception
05-01 20:21:58.830: E/AndroidRuntime(584): java.lang.RuntimeException: An error occured while executing doInBackground()
05-01 20:21:58.830: E/AndroidRuntime(584): at android.os.AsyncTask$3.done(AsyncTask.java:200)
05-01 20:21:58.830: E/AndroidRuntime(584): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
05-01 20:21:58.830: E/AndroidRuntime(584): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
05-01 20:21:58.830: E/AndroidRuntime(584): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
05-01 20:21:58.830: E/AndroidRuntime(584): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-01 20:21:58.830: E/AndroidRuntime(584): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
05-01 20:21:58.830: E/AndroidRuntime(584): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
05-01 20:21:58.830: E/AndroidRuntime(584): at java.lang.Thread.run(Thread.java:1096)
05-01 20:21:58.830: E/AndroidRuntime(584): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
05-01 20:21:58.830: E/AndroidRuntime(584): at android.os.Handler.<init>(Handler.java:121)
05-01 20:21:58.830: E/AndroidRuntime(584): at greg.projects.FileTransfer.FileTransferActivity$NamedFile$1.<init>(FileTransferActivity.java:588)
05-01 20:21:58.830: E/AndroidRuntime(584): at greg.projects.FileTransfer.FileTransferActivity$NamedFile.<init>(FileTransferActivity.java:588)
05-01 20:21:58.830: E/AndroidRuntime(584): at greg.projects.FileTransfer.FileTransferActivity$GesturesLoadTask.doInBackground(FileTransferActivity.java:489)
05-01 20:21:58.830: E/AndroidRuntime(584): at greg.projects.FileTransfer.FileTransferActivity$GesturesLoadTask.doInBackground(FileTransferActivity.java:1)
05-01 20:21:58.830: E/AndroidRuntime(584): at android.os.AsyncTask$2.call(AsyncTask.java:185)
05-01 20:21:58.830: E/AndroidRuntime(584): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
05-01 20:21:58.830: E/AndroidRuntime(584): ... 4 more
(FileTransferActivity.java:588 ist final Handler handler = new Handler() {
)
Welche Fehler sind Sie immer?
Ich habe es zu der Frage.
Sie haben nicht gemeinsam den für Sie relevanten Teil des Codes. post den code des Konstruktors der
Ich habe es zu der Frage.
Sie haben nicht gemeinsam den für Sie relevanten Teil des Codes. post den code des Konstruktors der
NamedFile
verschachtelt FileTransferActivity
. Vor allem rund um 588th Linie FileTransferActivity
final Handler handler = new Handler() {
ist line 588
InformationsquelleAutor 19greg96 | 2012-05-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen
Handler
ist im Grunde eine callback-Klasse, die Android verwendet, um asynchron code auszuführen, wenn Sie Sie senden Nachrichten in irgendeiner form. Um für eineHandler
zum empfangen und verarbeiten von Nachrichten in einen separaten thread aus der UI-thread, es muss halten, den thread zu öffnen. Das ist, wo die Looper Klasse kommt. Wie in dem Beispiel von der Seite, rufen SieLooper.prepare()
an der Spitze derrun()
Methode, dann rufen SieLooper.loop()
an der Unterseite. Der thread bleibt geöffnet, bis Sie explizit zu zerstören. Um zu zerstören, eineLooper
thread, müssen Sie eine Methode in IhrerThread
Klasse, dass AnrufeLooper.getMyLooper().quit()
.Ein Beispiel thread-Klasse wäre so etwas wie dieses:
Führen Sie den Faden in der Regel, indem ein neues Objekt erstellen.
Halten eine Referenz auf diese. Dann rufen Sie:
Wann immer Sie wollen, der thread sterben. Dies ist in der Regel in der
onPause()
,onStop()
oderonDestroy()
Methoden der Aktivität.Bitte beachten Sie, dass ein thread dieser Art wird offen bleiben, wenn die Aktivität ist geschlossen, so müssen Sie töten, bevor der Benutzer beendet.
sendThumbnail (path, buffer);
definiert ist, in der FileTransferActivity Klasse als statische Methode und bezieht sich auf eine statische variable (auch) in der FileTransferActivity Klasse?Handler, die Nachrichten verarbeiten, in welchem thread, in dem Sie entstanden sind. Wenn Sie die Prozedur zum verarbeiten von Nachrichten in der Haupt-thread, erstellen Sie die Handler in der main-thread. Dann pass Nachrichten aus dem thread.
Tausend Dank für diese - vollständige Lebensretter
Statt der Erstellung Ihrer benutzerdefinierten LoopThread, die Sie verwenden können, die Rahmenbedingungen handleThread, was bedeutet all dies für Sie: developer.android.com/reference/android/os/HandlerThread.html
InformationsquelleAutor DeeV
Führt die angegebene Aktion auf dem UI-thread
InformationsquelleAutor SurenSaluka
Empfehle ich HandlerThread als es bereitet die looper für Sie.
http://developer.android.com/reference/android/os/HandlerThread.html
InformationsquelleAutor dagalpin