Может ли кто-нибудь указать мне в правильном направлении здесь, пожалуйста?Передача обработчика с фона Обработчик Thread, в фоновый поток
У меня есть деятельность, которая порождает две нити, нить для обработки сообщений, используя Looper
public static class MiddleThread extends Handler{
static public Handler handler;
public void run() {
Looper.prepare();
Log.d("MiddleThread", "Looper is prepared !");
handler = new Handler() {
public void handleMessage(Message msg)
{
Bundle bundle = msg.getData();
String exitString = bundle.getString("endmessage");
if(exitString.equals(("ExitOK")))
{
boolean searchFinished = true;
Looper looper = Looper.myLooper();
looper.quit();
} else
{
int fileCount = bundle.getInt("filecount");
String fileName = bundle.getString("filename");
Log.d("MiddleThread", "File Number " + fileCount + " is " + fileName);
}
}
};
Log.d("MiddleThread", "nandler should be initialised");
Looper.loop();
}
... Затем он запускает основной рабочий поток, который передается обработчик из UI Thread, и обработчик из вышеупомянутого потока.
public class BasicSearch {
public Handler handlerUi, handlerMiddleThread;
public Message messageUi, messageMiddleThread;
public int fileCount = 0;
public BasicSearch(Handler ui, Handler mt) {
handlerUi = ui;
handlerMiddleThread = mt;
}
public void listFiles()
{
File searchPath = Environment.getExternalStorageDirectory();
messageUi = handlerUi.obtainMessage();
messageMiddleThread = handlerMiddleThread.obtainMessage();
walk(searchPath);
Bundle b = new Bundle();
b.putString("endmessage", "ExitOK");
messageMiddleThread.setData(b);
handlerMiddleThread.dispatchMessage(messageMiddleThread);
}
private void walk(File path) {
File[] list = path.listFiles();
for(File f : list)
{
if(f.isDirectory())
{
walk(new File(f.getAbsolutePath()));
} else {
processFile(f);
}
}
}
private void processFile(File f) {
Bundle b = new Bundle();
fileCount++;
b.putString("filename", f.getName());
b.putInt("filecount", fileCount);
messageMiddleThread.setData(b);
Log.d("BasicSearch", "Data is set, to send to MiddleThread");
handlerMiddleThread.dispatchMessage(messageMiddleThread);
Log.d("BasicSearch", "Message sent");
}
}
Что бы ни случилось, когда он пытается отправить сообщение, handlerMiddleThread возвращается к нулю. У меня даже есть следующий код в моей деятельности, чтобы убедиться, что он не является нулевым, но он все равно заканчивается пустым, когда я получаю сообщение.
startMiddleThread();
while(true)
{
if(MiddleThread.handler != null)
break;
}
startSearchThread();
Это тестовый проект, как я хотел, чтобы иметь возможность получить Handler/Looper концепции правильно понял, прежде чем продолжить с моим проектом.
До сих пор мне удалось использовать обработчик в моих потоках пользовательского интерфейса, но в моем текущем проекте слишком много обработки происходит в пользовательском интерфейсе, и я хочу, чтобы вторичный поток обрабатывал вывод из searchThread и просто получал сообщение в потоке пользовательского интерфейса, когда поток завершен.
введите код своей деятельности с кодом, который называется 'run' и' new BasicSearch' – njzk2