2013-07-17 1 views
0

Может ли кто-нибудь указать мне в правильном направлении здесь, пожалуйста?Передача обработчика с фона Обработчик 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 и просто получал сообщение в потоке пользовательского интерфейса, когда поток завершен.

+0

введите код своей деятельности с кодом, который называется 'run' и' new BasicSearch' – njzk2

ответ

2

Так что я думаю, я вижу, что вы пытаетесь сделать, и позвольте мне предложить несколько более простой способ:

Чтобы запустить фоновый поток и получить обработчик к ней:

HandlerThread bgThread = new HandlerThread(); 
bgThread.start(); 
Handler bgHandler = new Handler(bgThread.getLooper()); 

Тогда вы может отправлять любые сообщения, которые вы хотите получить в bgHandler. Обратите внимание, что вам нужно вызвать start на HandlerThread перед созданием bgThread (иначе getLooper() вернет null).

Это, как говорится, я думаю, что я знаю, что случилось с вашим кодом, когда вы его разместили. Во-первых, MiddleThread расширяет Handler (который не имеет метода run()!) Not Thread. Во-вторых, метод run() на MiddleThread никогда не вызывается, поэтому Handler никогда не создается. Даже если ваш неверный обработчик в вашем коде выше, и вы фактически расширяете Thread, вам все равно нужно запустить start на MiddleThread, чтобы что-либо в run() выполнялось. На самом деле, что вы делаете, сложнее, чем нужно, и вы почти наверняка хотите сделать то, о чем я говорил выше.

+0

Спасибо Monkeyless. Я вернул это в Thread, и на самом деле не нужен метод start(). Код в run() выполняется без него, это подтверждается выходом log.d в LogCat. Я проверю ваше предложение позже, но вы правы, я, может быть, чрезмерное. То, что я хочу сделать, может быть сделано в одном потоке, с помощью UI, который просто передается через обработчик - он завершен. Однако я просто хочу, чтобы использовать обработчики только для обработки фона. –

+0

А не использование обработчиков для фоновой обработки совершенно нормально, и это именно то, что делает мой пример. Любой runnable, передаваемый через bgHandler.post (новый Runnable() ...), будет выполнен в фоновом потоке. Я имел в виду, что для создания и использования фонового потока вам не нужно распространять Thread или создавать/вызывать Looper самостоятельно. Вместо этого вы можете использовать HandlerThread, как я показал, который обрабатывает все это для вас. –

 Смежные вопросы

  • Нет связанных вопросов^_^