Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android AsyncTask中的套接字处理传入数据太慢_Android_Sockets_Android Asynctask_Threadpool - Fatal编程技术网

Android AsyncTask中的套接字处理传入数据太慢

Android AsyncTask中的套接字处理传入数据太慢,android,sockets,android-asynctask,threadpool,Android,Sockets,Android Asynctask,Threadpool,我的代码结构有一个问题,它工作得很好,但处理数据需要150-200毫秒,而且它肯定会随着数据库的大小而增加。我曾考虑在线程中处理传入的数据,但这是可行的。以下是异步任务: public class IncomingData extends AsyncTask<Void, Void, String> { public BufferedReader input; public String read = null; public IncomingData()

我的代码结构有一个问题,它工作得很好,但处理数据需要150-200毫秒,而且它肯定会随着数据库的大小而增加。我曾考虑在线程中处理传入的数据,但这是可行的。以下是异步任务:

public class IncomingData extends AsyncTask<Void, Void, String> {

    public BufferedReader input;
    public String read = null;

    public IncomingData() {
    }

    @Override
    public String doInBackground(Void... params) {

        try {
            input = new BufferedReader(new InputStreamReader(
                    socket.getInputStream()));

            while (input.ready()) {
                read = input.readLine();

            }

        } catch (NullPointerException e) {

            e.printStackTrace();
        } catch (UnknownHostException e) {

            e.printStackTrace();
        } catch (IOException e) {

            e.printStackTrace();
        } catch (Exception e) {

        }

        return read;
    }

    @Override
    public void onPostExecute(final String input) {

        if (input != null) {
            InputStreamTokenizer(input);    
        }
        new IncomingData().execute();
    }
}
公共类IncomingData扩展异步任务{
公共缓冲读取器输入;
公共字符串read=null;
公共收入数据(){
}
@凌驾
公共字符串doInBackground(Void…params){
试一试{
输入=新的BufferedReader(新的InputStreamReader(
getInputStream());
while(input.ready()){
read=input.readLine();
}
}捕获(NullPointerException e){
e、 printStackTrace();
}捕获(未知后异常e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}捕获(例外e){
}
返回读取;
}
@凌驾
public void onPostExecute(最终字符串输入){
如果(输入!=null){
InputStreamTokenizer(输入);
}
新输入数据().execute();
}
}
所以基本上我是说函数InputStreamTokenizer需要200+毫秒才能完成,之后我可以读取新的输入行。 你知道我怎么做一根线或是什么吗?
谢谢,

使用executeOnExecutor(AsyncTask.THREAD\u POOL\u EXECUTOR)代替execute()

您已经在一个线程中拥有了所有功能。doInBackground就是这样做的,这是一个非常奇怪的代码。你读了一行还是更多?令牌服务器对读取的操作是不可见的。为什么将读取重命名为输入?非常混乱。在一行、两行或多行之后,启动另一个asynctask并创建一个新流。为什么,为什么,为什么?我想知道,有什么比异步任务更好的线程呢。把所有的代码都放在后台。处理循环中的每一行。Chillz Chillz:))创建并连接套接字后,我打开asynctask,在后台它读取一行输入,然后将其提供给postExecute,InputStreamTokenizer在其中处理它。它做什么并不重要,只是需要很多时间,因为有很多数据库查询。我只需要一个执行inputstremtokenisering的线程,以便AsyncTask可以返回读取套接字输入。如果inputStreamTokenizer接受.2秒,它应该在doinbackground中。如果您不应该从自身启动新的asynctask,也可以使用IDK。也许它应该返回,因为您已经读取了数据。