gpt4 book ai didi

java - 我是否正确使用了这个处理程序和执行器(Android)?

转载 作者:行者123 更新时间:2023-12-02 11:04:54 24 4
gpt4 key购买 nike

我有一个执行器,它运行 while true 循环,仅使用数据 ping 服务器。现在我需要使用这些数据更新 UI,因此我使用了处理程序。

在我的主要 Activity 中,我有:

private void createGeneralHandler() {
generalHandler = new Handler(Looper.getMainLooper()){
@Override


public void handleMessage(Message msg){

switch (msg.what){
case SERVER_RESPONSE:

serverTextView.append("\n"+msg.obj);
break;

default:
super.handleMessage(msg);
}
}
};
}

这会在主 Activity 中创建一个名为 generalHandler 的字段。

现在,NetworkTask 可运行需要了解此处理程序才能将消息发送到右侧?

所以我的主要 Activity 中有这个:

networkExecutor = Executors.newSingleThreadExecutor();
networkTask = new NetworkTask(serverIPAddress, serverPort);
networkTask.setRequest("I WANT DATA");
networkTask.setHandler(generalHandler); //IS THIS WRONG ???
networkExecutor.execute(networkTask);

networkTask 只是一个单独文件中的 Runnable,定义如下:

public class NetworkTask implements Runnable {

private int port;
private String ipAddress;
private int pollInterval;
private Socket socket = null;
private PrintWriter out = null;
private BufferedReader br = null;
private String request = null;
private String response = null;
private static final int SERVER_RESPONSE = 1;
private Handler handler = null;

public NetworkTask(String ipAddress, int port){
this.port = port;
this.ipAddress = ipAddress;
this.pollInterval = 50;
}

@Override
public void run() {

try {
socket = new Socket(ipAddress, port);
out = new PrintWriter(socket.getOutputStream(), true);
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}

try {
while (!Thread.currentThread().isInterrupted()) {

Thread.sleep(pollInterval);

out.println(request);
try {
response = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
if(!response.equals("doNothing")){
Message message = new Message();
message.what = SERVER_RESPONSE;
message.obj = response;
handler.sendMessage(message);
}else if(response.equals("Nothing Connected to Server!")){
Message message = new Message();
message.what = SERVER_RESPONSE;
message.obj = response;
handler.sendMessage(message);
}
}
} catch (InterruptedException threadE) {
try {
br.close();
out.close();
socket.close();
} catch (IOException socketE) {
socketE.printStackTrace();
}
Log.i("NETWORK_TASK_THREAD", "NETWORK TASK closed gracefully!");
}

}

public void setRequest(String request) {
this.request = request;
}

public void setHandler(Handler handler) {
this.handler = handler;
}
}

最佳答案

你的问题的回答有点武断。由于实现只是一个设计选择,所以没有对错之分,只有好坏之分。

以下是我想强调的几点:

  • 如果您只是关心 networkTask.setHandler(generalHandler); 那么只要您不在主线程上调用任何网络调用或繁重的处理就可以了。
  • 您还需要确保您的 Runnable 在应用 onStop()onDestroy() 中适当中断,以避免潜在的内存泄漏。
  • 您不断尝试对服务器执行 ping 操作,这不是一个好主意,因为它会消耗资源并耗尽电池电量。您可以定期执行这些任务或使用 FCM 推送。
  • 对于关闭 InputStreams 或 OutputStreams,最好在 finally {..} block 中进行清理,这样可以保证在执行过程中发生其他异常时进行清理。

一种替代方案是实现 ViewModelMutableLiveData 并执行操作。这不会因不必要的处理而使您的 Activity 膨胀。

关于java - 我是否正确使用了这个处理程序和执行器(Android)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51052577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com