#java #android #multithreading #android-activity #tcp
#java #Android #многопоточность #android-активность #tcp
Вопрос:
У меня есть activity с тремя фрагментами, на нем привязан класс, который отвечает за мое tcp-соединение в activity. Класс TCP работает как асинхронный. Внутри onCreate
метода основного действия я запускаю tcp-соединение. Затем, когда я нажимаю кнопку, я начинаю новое действие и получаю текущее tcp-соединение в новом действии, используя одноэлементный класс. Я могу отправлять сообщения из новой активности на сервер, используя доступный tcp. Однако это задача asyc, поэтому я не могу вносить изменения в новую активность в соответствии с сообщением, полученным с сервера. Как я могу изменить макет новой активности из асинхронной задачи?
//Activity code:
public class MainScreen extends FragmentActivity implements ActionBar.TabListener {
TCPClient mTcpClient;
connectTask cnnTask;
///The class is responsible for tcp connection
public class connectTask extends AsyncTask<String, String, TCPClient> {
@Override
public TCPClient doInBackground(String... message) {
//we create a TCPClient object
mTcpClient = new TCPClient(new TCPClient.OnMessageReceived() {
@Override
//here the messageReceived method is implemented
public void messageReceived(String message) {
//do process
}
}
protected void onCreate(Bundle savedInstanceState) {
SharedPreferences preferences = null;
super.onCreate(savedInstanceState);
try {
cnnTask = new connectTask();
preferences = this.getSharedPreferences("MyPreferences",
Context.MODE_PRIVATE);
mTcpClient.SERVERIP = preferences.getString("IPAddress", "0");
mTcpClient.SERVERPORT = Integer.parseInt(preferences.getString("Port", "13759"));
cnnTask.execute("");
} catch (Exception e) {
}
//..
SingletonTCP .getInstance().setmTCPClient(mTcpClient);
}
//Fragment code:
public class FragmentDesign extends Fragment implements View.OnClickListener {
public void onClick(View v) {
String name = v.getTag().toString();
Intent intent = new Intent(getActivity(),NewActivity.class);
intent.putExtra("Name", this._name);
startActivity(intent);
}
}
//Singleton class to set and get the current TCPClient.
public class SingletonTCP {
private TCPClient mTCPClient;
public TCPClient getmTCPClient() { return mTCPClient; }
public void setmTCPClient(TCPClient mTCPClient) {this.mTCPClient = mTCPClient;}
private static final SingletonTCP holder = new SingletonTCP ();
public static SingletonTCP getInstance() {return holder;}
}
enter code here
//New activity code.
public class NewActivity extends Activity implements View.OnClickListener {
public class TCP extends AsyncTask<String, String, TCPClient> {
@Override
protected TCPClient doInBackground(String... params) {
mTCPClient = new TCPClient(new TCPClient.OnMessageReceived() {
@Override
public void messageReceived(String message) {
mes = message;
}
});
return null;
}
}
@Override
public void onClick(View v) {
String command = "<message>";
this.mTCPClient.sendMessage(command);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
mTCPClient = SingletonTCP .getInstance().getmTCPClient();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_activity);
Bundle extras = getIntent().getExtras();
departmanAdi = extras.getString("Name");
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(this);
tcp = new TCP();
tcp.execute("");
}
}
Ответ №1:
Вы могли бы вызвать publishProgress()
изнутри doInBackground(), который будет вызывать onProgressUpdate()
в потоке пользовательского интерфейса. В onProgessUpdate() вы можете получить доступ к своей активности и внести в нее изменения.
Это описано в документации здесь.
Комментарии:
1. Конечно, никаких проблем. Часто onProgressUpdate() используется для обновления индикатора выполнения, но его можно использовать для других задач, которые необходимо выполнить в потоке пользовательского интерфейса, которые основаны на ходе выполнения или состоянии вашего фонового потока.