从服务器检索数据花费了太多时间

Posted

技术标签:

【中文标题】从服务器检索数据花费了太多时间【英文标题】:Too much time consumed to retrieve data from server 【发布时间】:2018-11-03 10:24:18 【问题描述】:

我正在开发一个从 php 服务器检索数据的应用程序。我从 php 服务器接收一个 json 数组。当我在 android 模拟器中运行 apk 时,它可以完美运行,但是当我在真正的 android 手机上运行这个 apk 时会出现问题。检索数据需要太多时间。我搜索了很多资源,但我无法解决这个问题。请任何人给我一些提示来解决这个问题。提前致谢。

CostForSecretCloseMem 类

public class CostForSecretCloseMem extends AppCompatActivity


        private ListView listView;
        private RelativeLayout emptyView;

        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) 
                super.onCreate(savedInstanceState);
                setContentView(R.layout.costs_layout);
                initComponent();
        

        @SuppressLint("SetTextI18n")
        private void initComponent()
        
                emptyView = findViewById(R.id.empty_view);
                SharedPreferenceData sharedPreferenceData = new SharedPreferenceData(this);
                CheckInternetIsOn internetIsOn = new CheckInternetIsOn(this);
                listView = findViewById(R.id.list);
                if(internetIsOn.isOnline())
                
                        try 
                                String DATA = URLEncoder.encode("userName", "UTF-8") + "=" + URLEncoder.encode(sharedPreferenceData.getCurrentUserName(), "UTF-8");
                                //importantData.getAllShoppingCost(getResources().getString(R.string.shoppingCost), DATA,infoInterfaces);
                                TestBackground testBackground = new TestBackground(this);
                                testBackground.setOnResultListener(infoInterfaces);
                                testBackground.execute(getResources().getString(R.string.shoppingCost),DATA);
                         catch (UnsupportedEncodingException e) 
                                e.printStackTrace();
                        

                
        

        //process shopping only_show_cost json data
        private void processJsonData(String result)
        
                List<CostModel> costList = new ArrayList<>();
                int count=0;
                String name,taka,date,id;
                try 
                        JSONObject jsonObject = new JSONObject(result);
                        JSONArray jsonArray = jsonObject.optJSONArray("costList");

                        while (count<jsonArray.length())
                        
                                JSONObject jObject = jsonArray.getJSONObject(count);
                                id = jObject.getString("id");
                                name = jObject.getString("name");
                                taka = jObject.getString("taka");
                                date = jObject.getString("date");

                                costList.add(new CostModel(id,name,taka,date,""));
                                count++;
                        

                        if(costList.isEmpty())
                                listView.setEmptyView(emptyView);
                        else
                                emptyView.setVisibility(View.INVISIBLE);

                        CostAdapter adapter = new CostAdapter(this, costList);
                        listView.setAdapter(adapter);
                 catch (JSONException e) 
                        e.printStackTrace();
                
        

        //get all shopping list
        OnAsyncTask infoInterfaces = new OnAsyncTask() 
                @Override
                public void onSuccess(final String result) 
                        runOnUiThread(new Runnable() 
                                @Override
                                public void run() 
                                        if(result!=null)
                                                processJsonData(result);
                                
                        );
                
        ;

异步任务

public class TestBackground extends AsyncTask<String,Void,String>

     private Context context;
     private OnAsyncTask onAsyncTaskInterface;

     public TestBackground(Context context)
     
          this.context = context;
     


     //success result
     public void setOnResultListener(OnAsyncTask onAsyncResult) 
          if (onAsyncResult != null) 
               this.onAsyncTaskInterface = onAsyncResult;
          
     

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

          String result = "";
          String fileName = params[0];
          String postData = params[1];

          try 
               URL url = new URL(fileName);
               HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
               httpURLConnection.setRequestMethod("POST");
               OutputStream outputStream = httpURLConnection.getOutputStream();
               OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");
               BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);

               bufferedWriter.write(postData);
               bufferedWriter.flush();
               bufferedWriter.close();
               outputStream.close();
               InputStream inputStream = httpURLConnection.getInputStream();
               BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "iso-8859-1"));

               String line;

               while ((line= bufferedReader.readLine())!=null)
                    result = line;

               bufferedReader.close();
               inputStream.close();
               httpURLConnection.disconnect();
               onAsyncTaskInterface.onSuccess(result);

           catch (MalformedURLException e) 
               e.printStackTrace();
           catch (IOException e) 
               e.printStackTrace();
          catch (Exception e)
          
               e.printStackTrace();
          
          return result.toString();
     


      public interface OnAsyncTask 
                void onSuccess(String message);
        

php代码

<?php

    require"connection.php";
    require"getSession.php";

    $userName = $_POST["userName"];
    $session = new Sessions();
    $month = $session->session($userName);

    $sql = "SELECT GroupID FROM member_info WHERE UserName LIKE '$userName';";
    $result = mysqli_query($conn,$sql);

    if($result->num_rows>0)
    
        while($row=mysqli_fetch_array($result))
        
            if($row["GroupID"]!="Null")
                getCostList($row["GroupID"],$month);
        
    

    function getCostList($value,$month)
    
        require"connection.php";
        $sql = "SELECT * FROM cost WHERE groupName LIKE '$value' and cMonth LIKE '$month';";
        $result = mysqli_query($conn,$sql);

        $response = array();

        if($result->num_rows>0)
        
            while($row=mysqli_fetch_array($result))
                array_push($response,array("id"=>$row[0],"name"=>$row[1],"taka"=>$row[4],"date"=>$row[5]));

            echo json_encode(array("costList"=>$response));
        
    

    $conn->close();
?>

【问题讨论】:

使用 wifi 或移动连接?你的服务器在哪里运行?你可以给出数字! onAsyncTaskInterface.onSuccess(result); 通常会在 onPostExecute() 中调用接口。然后你就可以摆脱 runOnUiThread()。 我也这样做了,但出现同样的问题...... 我强烈建议使用 Volley 或 Retrofit,而不是直接使用 HttpUrlConnection,这样可以最小化代码并摆脱 AsyncTask,它会显着提高速度。我曾经和你做同样的事情,当我切换到 volley 时,http 请求变得更快了。 是 PHP 脚本返回的时间过长还是连接速度慢? 【参考方案1】:

你在代码中犯了很多错误。

    不建议使用 SELECT * 来获取数据,您知道所需的所有数据是什么,因此请具体选择哪些数据(id、name、taka、date))。 从查询中选择后使用 while 循环,您应该使用 fetch all 并按原样返回数据。 使用 JOIN 查询获取单个查询中的数据。

如果你使用上述方法,它会非常快。

 require"connection.php";

上面一行使用了两次是错误的,而是使用全局变量来获取函数内部的数据库连接。

【讨论】:

他们的数据量大还是很正常?

以上是关于从服务器检索数据花费了太多时间的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 花费了太多时间

BLE 在将数据从 iOS 7.1 发送到 iOS 8 时花费了太多时间

从 Sqlite 游标创建 Pojo 类花费了太多时间

标准缩放它在 pyspark 数据帧中花费了太多时间

嵌套的 Foreach 循环花费了太多时间

从服务器发送数据到客户端Nodejs