У меня есть активность с тремя фрагментами, на которой он нарисован, и есть класс, который отвечает за мое соединение tcp в действии. Класс TCP работает как async. Внутри onCreate
метод основной активности. Я запускаю соединение tcp. Затем, когда я нажимаю кнопку, я запускаю новое действие и получаю текущее соединение tcp в новой активности с использованием одноэлементного класса. Я могу отправлять сообщения от нового действия на сервер с помощью доступного tcp. Однако это задача asyc, поэтому я не могу выполнять изменения в новом действии в соответствии с сообщением, полученным от сервера. Как изменить макет новой активности из задачи async?Вызывающая активность изнутри фоновой темы
//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("");
}
}
спасибо. Я попробую. – Blast
Несомненно, никаких проблем. Часто onProgressUpdate() используется для обновления индикатора выполнения, но его можно использовать для других вещей, которые нужно запускать в потоке пользовательского интерфейса, которые основаны на прогрессе или состоянии вашего фонового потока. – JDJ