Я пытаюсь принимать сокет-соединения от клиентов.
Но в моем AsyncTask
я столкнулся с двумя ситуациями, когда мне нужно обновить поток пользовательского интерфейса. В первом случае, когда сокет подключен, он должен изменить текущее представление содержимого. И второй случай, когда я получаю постоянный поток объектов, которые я обновляю в интерфейсе пользователя через publishProgress()
.
Как мне это сделать?
public class MainActivity extends AppCompatActivity {
myCustomDrawingView view;
....
....
.
public static MainActivity getContext(){return context;}
....
..
public class myCustomDrawingView extends View {
..
..
}
setNewContentView(){
view = new myCustomDrawingView(this);
setContentView(view);
}
}
class ServerTask extends AsyncTask<Void, Action, Void>
{
private WeakReference<MainActivity> mainActivity;
private Action action;
@Override
protected void onPreExecute() {
super.onPreExecute();
mainActivity = new WeakReference<>(MainActivity.getContext());
}
@Override
protected Void doInBackground(Void... voids) {
ObjectInputStream stream;
try{
mainActivity.get().server = new ServerSocket(3107);
mainActivity.get().socket = mainActivity.get().server.accept();
stream = new ObjectInputStream(mainActivity.get().socket.getInputStream());
(mainActivity.get()).setNewContentView();
/*I know this won't work....
But I want something like this to happen.
What are Alternatives?*/
while(true)
{
if(isCancelled()){
break;
}
action = (Action)stream.readObject();
publishProgress(action);
}
}catch (Exception exception)
{
exception.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(Action... actions) {
super.onProgressUpdate(actions);
((mainActivity.get()).myCustomDrawingView).draw(actions[0]);
}
}