【问题标题】:Calling activity from inside a background thread从后台线程内部调用活动
【发布时间】:2014-07-02 12:37:05
【问题描述】:

我有一个活动,上面附加了三个片段,并且有一个类负责我的活动中的 tcp 连接。 TCP 类作为异步工作。在主要活动的onCreate 方法中,我正在启动tcp 连接。然后,当我单击一个按钮时,我将开始一个新活动并使用单例类在新活动中获取当前 tcp 连接。我可以使用可用的 tcp 将消息从新活动发送到服务器。但是,这是一个异步任务,因此我无法根据从服务器接收到的消息对新活动进行更改。 如何从异步任务中更改新活动的布局?

//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("");
    }
 }

【问题讨论】:

    标签: java android multithreading android-activity tcp


    【解决方案1】:

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

    这在文档here中有描述。

    【讨论】:

    • 当然,没问题。通常 onProgressUpdate() 用于更新进度条,但它也可用于需要在 UI 线程上运行的基于后台线程的进度或状态的其他事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    相关资源
    最近更新 更多