2014-07-02 6 views
0

У меня есть активность с тремя фрагментами, на которой он нарисован, и есть класс, который отвечает за мое соединение 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(""); 
    } 
} 

ответ

0

Вы могли бы назвать publishProgress() внутри doInBackground(), который будет вызывать onProgressUpdate() в потоке пользовательского интерфейса. В onProgessUpdate() вы можете получить доступ и внести изменения в свою деятельность.

Это описано в документации here.

+0

спасибо. Я попробую. – Blast

+0

Несомненно, никаких проблем. Часто onProgressUpdate() используется для обновления индикатора выполнения, но его можно использовать для других вещей, которые нужно запускать в потоке пользовательского интерфейса, которые основаны на прогрессе или состоянии вашего фонового потока. – JDJ

Смежные вопросы