Вызывающая активность из фонового потока

#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() используется для обновления индикатора выполнения, но его можно использовать для других задач, которые необходимо выполнить в потоке пользовательского интерфейса, которые основаны на ходе выполнения или состоянии вашего фонового потока.