2014-07-02 67 views
0

我有一个活动,有三个片段在它上面,并且有一个类负责我的活动中的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(""); 
    } 
} 

回答

0

你可以称之为publishProgress()从内部doInBackground(),它会调用onProgressUpdate()在UI线程上。在onProgessUpdate()中,您可以访问并更改您的活动。

这在文档here中描述。

+0

谢谢。我会尝试。 – Blast

+0

当然,没问题。通常onProgressUpdate()用于更新进度条,但它可用于其他需要在UI线程上运行的基于进度或后台线程状态的事情。 – JDJ