从后台线程内部调用活动

时间:2014-07-02 12:37:05

标签: java android multithreading android-activity tcp

我有一个活动,其上有三个片段,并且有一个类负责我在活动中的tcp连接。 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 个答案:

答案 0 :(得分:0)

您可以从doInBackground()内部调用publishProgress(),这将调用UI线程上的onProgressUpdate()。在onProgessUpdate()中,您可以访问和更改您的活动。

文档here中描述了这一点。