2016-12-04 16 views
0

Я пытаюсь заполнить список ресайклеров списком транзакций, которые я получаю с сервера. но если я не поставил Thread.sleep(7000), он не будет заполняться. Вам нужно много времени, чтобы получить данные со стороны сервера? Если да, есть ли более быстрая альтернатива?Получение данных с сервера слишком медленно? (Android)

или получает строку от ответа json и добавление объекта в список занимает много времени? потому что этот сон просто работает для добавления 5 строк в список. когда я пытаюсь запустить цикл для целого числа строк, я не получаю никаких данных.

Мой хозяин: PythonAnywhere. ответ Api в JSON и имеет около 400 записей:

http://sairav.pythonanywhere.com/getTransaction

Использование:

Android Асинхронный Http Клиент ::: компиляции «com.loopj.android:android-async-http : 1.4.9'

public List<Transaction> getTransactions(final boolean getAll) { 
     Thread bgThread =null; 

     final List<Transaction> trList=new ArrayList<>(); 
     RequestParams requestParams = new RequestParams(); 

     requestParams.put("uid", Profile.getCurrentProfile().getId()); 

     PAAPI.post("/getTransaction", requestParams, new JsonHttpResponseHandler() { 

@Override 
      public void onSuccess(int statusCode, Header[] headers, JSONArray jsonArray) { 

       Transaction trr = null; 
       if (getAll) { 


        for (int i = 0; i < 5; i++) { 

         try { 
          //String a = jsonArray.getString(i); 
          JSONObject jsonObject = jsonArray.getJSONObject(i); 
          //JSONArray arrayWithElements = jsonObject.toJSONArray(new JSONArray(new String[]{"name","desc","amount","ttype","uid","ttime"})); 

          trr = new Transaction(context); 

          trr.uname = jsonObject.getString("uname"); 
          trr.desc = jsonObject.getString("description"); 
          trr.amount = jsonObject.getString("amount"); 
          trr.type = jsonObject.getString("type"); 
          trr.uid = jsonObject.getString("uid"); 
          trr.date = jsonObject.getString("ttime"); 

          trList.add(trr); 
          // Toast.makeText(context,"size is bro :"+trList.size(),Toast.LENGTH_SHORT).show(); 
          if (i == 1) { 
        //    Toast.makeText(context, trr.uname + "-" + desc + "-" + trr.amount + "-" + trr.type + "-" + trr.uid + "-" + trr.date, Toast.LENGTH_SHORT).show(); 
          } 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 

        } 

        // Do something with the response 

       } 
}); 
     try { 
      Toast.makeText(context,"sleeping bo",Toast.LENGTH_SHORT).show(); 

      Thread.sleep(7000); 

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

     // Toast.makeText(context, "listsize final is" + trList.size(), Toast.LENGTH_SHORT).show(); 
     return trList; 
    } 



class PAAPI { 
    protected static final String BASE_URL = "http://sairav.pythonanywhere.com"; 

    private static AsyncHttpClient client = new AsyncHttpClient(); 

    public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) { 
     client.post(getAbsoluteUrl(url), params, responseHandler); 
    } 

    public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) { 
     client.post(getAbsoluteUrl(url), params, responseHandler); 
    } 

    private static String getAbsoluteUrl(String relativeUrl) { 
     return BASE_URL + relativeUrl; 
    } 
} 
+0

первые вещи сначала. вы уверены, что ваше приложение получает данные JSON с сервера? – user1506104

+0

да, именно поэтому я смог получить данные после сна, не так ли? – user3820753

+0

, тогда он отвечает на ваш первый вопрос: требуется ли столько времени для получения данных со стороны сервера? – user1506104

ответ

0

Использование библиотеки модифицированная доступны для получения или опубликовать д ата из JSon URL ... он очень прост в использовании и является эффективным

+0

Я фактически использовал AsyncTask вместо API-интерфейсов loopj, и, похоже, он работает неплохо. Без задержки. Попробует также модифицировать. Благодарю . – user3820753

0

Если вы уверены, что getString() операция занимает слишком много времени для выполнения, то вы можете использовать окно выполнения вместо использования Thread.sleep()

private class PAAPI extends AsyncTask<Boolean, Void, List<Transaction> { 

    ProgressDialog dialog = new ProgressDialog(MainActivity.this); 

    @Override 
    protected void onPreExecute() { 
     //set message of the dialog 
     dialog.setMessage("Loading..."); 
     //show dialog 
     dialog.show(); 
     super.onPreExecute(); 
    } 

    protected Void doInBackground(Boolean... args) { 
     // do background work here 
     return null; 
    } 

    protected void onPostExecute(List<Transaction> result) { 
    // do UI work here 
    if(dialog != null && dialog.isShowing()){ 
     dialog.dismiss() 
    } 
    } 
} 

, а затем использовать его как new PAAPI().execute(getAll);

+0

спасибо Shubham, получается, что была создана библиотека loopj, я вместо этого использовал AsyncTask, теперь отлично работает. – user3820753

+0

Приятно слышать это !! :) – Shubham