Вопрос по android – Как отобразить тост внутри обработчика / потока?
Я хочу отобразить тост, как только сообщение отправлено в сокет. После этого "Log.d (" ClientActivity "," C: отправлено ");"
Нужно ли создавать отдельную ветку для отображения Toast?
public class ClientActivity extends Activity {
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.client);
serverIp = (EditText) findViewById(R.id.EditText01);
message =(EditText) findViewById(R.id.EditText02);
connectPhones = (Button) findViewById(R.id.Button01);
}
public void Click1(View v) {
if (!connected) {
serverIpAddress = serverIp.getText().toString();
if (!serverIpAddress.equals("")) {
Thread cThread = new Thread(new ClientThread());
cThread.start();
}
}
}
private class ClientThread implements Runnable {
public void run() {
try {
InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
Log.d("ClientActivity", "C: Connecting...");
Socket socket = new Socket(serverAddr, ServerActivity.SERVERPORT);
connected = true;
while (connected) {
try {
if(i>5)
{
}
else
{
Log.d("ClientActivity", "C: Sending command.");
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
.getOutputStream())), true);
// where you issue the commands
message1= message.getText().toString();
out.println(message1);
i=i+1;
Log.d("ClientActivity", "C: Sent.");
}
} catch (Exception e) {
Log.e("ClientActivity", "S: Error", e);
}
}
socket.close();
Log.d("ClientActivity", "C: Closed.");
} catch (Exception e) {
Log.e("ClientActivity", "C: Error", e);
connected = false;
}
}
}
}
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
System.out.println("I'm in handler");
Toast.makeText(YourActivity.this, "This is a toast", Toast.LENGTH_SHORT).show();
}
}, 1000);
Сначала объявите глобальный обработчик,
Handler handler=null;
Затем создайте обработчик в вашем onCreate () следующим образом:
Handler handler=new Handler()
{
public void handleMessage(Message msg)
{
if(msg.what==0)
{
Toast.makeText(ClientActivity.this,"Your Toast Mesage Goes here",Toast.LENGTH_LONG).show();
}
}
};
И теперь в вашем классе Runnable добавьте эту строку после"Log.d("ClientActivity", "C: Sent.");"
handler.sendEmptyMessage(0);
Проблема, с которой вы сталкиваетесь, заключается в том, что вы не можете обновить пользовательский интерфейс из runnable. Обработчики соединяют вас с вашим основным интерфейсом. Таким образом, вы должны передать сообщение вашему обработчику из вашего Runnable.
ет доступа кgetApplicationContext()
что вы передаете это. Вы каким-то образом должны установить связь с потоком пользовательского интерфейса (т.е. основным потоком).
Поэтому, когда вы хотите что-нибудь выпить, сделайте это вhandler.Post(Runnable)
метод. Обработчикmiddle man
между потоком пользовательского интерфейса и отдельным потоком, который вы работаете. Все операции пользовательского интерфейса должны быть выполнены вhandler.Post(Runnable)
& APOS; srun()
метод.
Так что в своей деятельности для отображения тоста сделайте следующее:
private class ClientThread implements Runnable {
public void run() {
try {
InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
.....
.....
message1= message.getText().toString();
out.println(message1);
i=i+1;
Log.d("ClientActivity", "C: Sent.");
handler.post(new Runnable(){
public void run()
{
Toast.make(....);
}
});
Не забудьте объявить и инициализировать объект-обработчик в вашей основной деятельности (вне потока)
handler=new Handler();
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(ClientActivity.this,"asdf",Toast.LENGTH_LONG).show();
}
});
после этой строки
Log.d("ClientActivity", "C: Connecting...");