Java 是否可以在活动中重载onProgressUpdate?
我正在尝试接受来自客户端的套接字连接。 但是在我的Java 是否可以在活动中重载onProgressUpdate?,java,android,multithreading,android-asynctask,Java,Android,Multithreading,Android Asynctask,我正在尝试接受来自客户端的套接字连接。 但是在我的AsyncTask中,我遇到了两种需要更新UI线程的情况。第一种情况是,一旦连接了套接字,它就应该更改当前的内容视图。第二种情况是,我通过publishProgress()在UI上不断更新对象流。 我该怎么做呢 public class MainActivity extends AppCompatActivity { myCustomDrawingView view; .... .... . public stat
AsyncTask
中,我遇到了两种需要更新UI线程的情况。第一种情况是,一旦连接了套接字,它就应该更改当前的内容视图。第二种情况是,我通过publishProgress()
在UI上不断更新对象流。
我该怎么做呢
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]);
}
}
public类MainActivity扩展了AppCompatActivity{
myCustomDrawingView;
....
....
.
公共静态MainActivity getContext(){return context;}
....
..
公共类myCustomDrawingView扩展了视图{
..
..
}
setNewContentView(){
视图=新的myCustomDrawingView(此视图);
setContentView(视图);
}
}
类ServerTask扩展了AsyncTask
{
私人WeakReference主要活动;
私人行动;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
mainActivity=newweakreference(mainActivity.getContext());
}
@凌驾
受保护的空位背景(空位…空位){
目标输出流;
试一试{
mainActivity.get().server=newserversocket(3107);
mainActivity.get().socket=mainActivity.get().server.accept();
stream=newObjectInputStream(mainActivity.get().socket.getInputStream());
(mainActivity.get()).setNewContentView();
/*我知道这行不通。。。。
但我希望这样的事情发生。
什么是替代方案*/
while(true)
{
如果(isCancelled()){
打破
}
action=(action)stream.readObject();
出版进度(行动);
}
}捕获(异常)
{
异常。printStackTrace();
}
返回null;
}
@凌驾
受保护的void onProgressUpdate(操作…操作){
super.onProgressUpdate(操作);
((mainActivity.get()).myCustomDrawingView.draw(操作[0]);
}
}
设置回调..看起来很有趣!我会试一试,然后告诉你它是否有效。谢谢嗯,ServerTask
似乎是一个具体的类。如果它是一个内部类,那么您可以直接访问外部类属性。您确定如果我将它设置为内部类,那么它不会引起任何问题吗。我猜你这么说是因为我使用了弱引用和上下文,不是吗?而且,即使我将其作为一个内部类,它也不会改变我不能从后台任务中接触UI线程的事实。这件事还是老样子