2010-06-10 2 views
2

сказать, например, у меня есть этот код в моей деятельности:андроид вызова внешняя функция из потока

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    Thread cThread = new Thread(new Runner()); 
    cThread.start(); 
} 

private NotifyMe(){ 
    //do something here 
} 

и это мой Runner класс:

public class TCPClient implements Runnable { 
    public void run(){ 
     //call NotifyMe() [THIS IS MY QUESTION] 
    } 
} 

У меня есть поток на моей деятельности который запускает класс Runner. После начала потока я хотел бы вызвать функцию NotifyMe() , которая находится в этом действии. Это возможно? Пожалуйста, дайте мне знать, если вы не понимаете мой вопрос.

ответ

1

Вы можете добавить конструктор в TCPClient, который ссылается на активность, изменить метод notifyMe на общедоступный, а затем вызвать метод notifyMe для объекта активности, который хранится в потоке.

Проблема, с которой вы столкнетесь, заключается в том, что действия могут быть закрыты, приостановлены, уничтожены во время работы вашего потока. Чтобы проверить, активна ли активность, используйте метод isFinishing() из этой активности.

Это решение несколько опасно, если в вашей активности используется много памяти, поскольку ссылка на активность в потоке позволит сборщику мусора не возвращать память, используемую чертежами пользовательского интерфейса в активности и т. Д., Пока поток выполняется и может быть собрано также мусор. Если ваша деятельность не так тяжела в памяти, что должно быть хорошо. Если это так, или если вы хотите получить доступ к данным из потока из нескольких действий, посмотрите на это question.

Более или менее несвязанные примечания, если у вас очень маленький поток, который не будет работать все время, когда работает приложение, используйте AsyncTask. Это позволит вам просто поместить одну операцию в фоновый режим.

+0

yup .. Я следил за вашим первым предложением и работает для меня. Благодарю. Если вы не возражаете, я хотел бы задать следующий вопрос. В моем методе NotifyMe() я попытался вызвать Toast.maketext, но он создает исключение. java.lang.RuntimeException: Can ' t создать обработчик внутри потока, который не вызвал Looper.prepare(). .. Что вызывает это исключение? Но если я удалю Toast.maketext, это не вызовет проблемы. – junmats

+0

Создайте новый вопрос (ссылка на этот вопрос, если вам нужно, если для уточнения) и отправьте ссылку сюда, тогда я или кто-то другой может ответить на него соответствующим образом – Janusz

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