Слишком много времени заняло получение данных с сервера

0

Я разрабатываю приложение, которое извлекает данные с php-сервера. Я получаю json-массив с сервера php. Когда я запускаю apk в эмуляторе Android, он работает отлично, но проблема возникает, когда я запускаю этот apk на реальном Android-телефоне. Для получения данных требуется слишком много времени. Я искал много ресурсов, но я не могу решить эту проблему. Пожалуйста, дайте мне несколько советов, чтобы решить эту проблему. Заранее спасибо.

Класс 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);
                                }
                        });
                }
        };
}

AsyncTask

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();
?>
  • 0
    Используете Wi-Fi или мобильную связь? Где работает ваш сервер? И вы могли бы привести цифры!
  • 0
    onAsyncTaskInterface.onSuccess(result); Обычно можно вызвать интерфейс в onPostExecute (). И тогда вы можете избавиться от runOnUiThread ().
Показать ещё 4 комментария
Теги:
android-asynctask

1 ответ

0

Вы совершили много ошибок в своем коде.

  1. Использование SELECT * не было хорошим советом для получения данных. Вы знаете, какие все необходимые данные должны быть конкретными, которые выбирают данные (id, name, taka, date)).
  2. Используя цикл while после выбора из запроса, вы должны использовать fetch all и возвращать данные как есть.
  3. Используйте запрос JOIN для получения данных в одном запросе.

Если вы сделаете это выше, это будет значительно быстрее.

 require"connection.php";

Над строкой, используемой два раза, вместо этого используется глобальная переменная, чтобы получить внутреннюю функцию DB.

  • 0
    Спасибо, я решил мои ошибки, которые вы сказали, но все еще возникает эта проблема ....
  • 0
    У них большой размер данных или он вполне нормальный?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню