该应用程序可能在其主线程上做过多的工作-使用执行程序

时间:2018-06-25 17:10:59

标签: android

我在onCreate()中拥有这样的代码结构:

connectToServerbutton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                    //create executor and start that will get the server requests
                    networkExecutor = Executors.newSingleThreadExecutor();
                    networkTask = new NetworkTask(serverIPAddress,serverPort);
                    networkTask.setRequest(getRequestFromDrives(drivesList));
                    networkTask.setHandler(generalHandler);
                    networkExecutor.execute(networkTask);

                }
        });

在我的网络任务中,我有:

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

...Get response and do stuff on the UI
..
.

现在,如果我继续按下按钮,将创建一个新的连接。

我的问题是:

为什么我总是在日志中收到此消息:

“应用程序可能在其主线程上做太多工作”

好吧,我正在使用执行程序,因此它们应该在后台运行吗?

编辑:NetworkTask的完整代码

import android.os.Handler;
import android.os.Message;
import android.util.Log;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.concurrent.atomic.AtomicBoolean;

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("No Robot 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;
    }
}

0 个答案:

没有答案