【问题标题】:Getting data from Server too slow ? (Android)从服务器获取数据太慢? (安卓)
【发布时间】:2016-12-04 04:45:56
【问题描述】:

我正在尝试通过我从服务器获得的交易列表填充RecyclerView。但除非我放一个 Thread.sleep(7000) ,否则它不会填充。 从服务器端获取数据需要这么多时间吗?如果是,有没有更快的替代方案?

或者是从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;
    }
}

【问题讨论】:

  • 第一件事。您确定您的应用正在从服务器获取 JSON 数据吗?
  • 是的,这就是为什么我能够在睡眠后获取数据,对吧?
  • 那么它回答了你的第一个问题:从服务器端获取数据需要这么长时间吗?
  • 我不认为它有,难道我已经得到了整个响应,但执行 getString 和添加到列表操作仍然需要时间吗?
  • 调用是异步的。无论您需要做什么,都在回调中执行,而不是返回值。

标签: android json httpresponse pythonanywhere loopj


【解决方案1】:

如果您确定 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);

【讨论】:

  • 感谢 Shubham,原来 loopj 库是原因,我用 AsyncTask 代替,现在工作正常。
  • 很高兴听到这个消息! :)
【解决方案2】:

使用可用于从 JSON URL 检索或发布数据的改造库 ...它非常易于使用且高效

【讨论】:

  • 我实际上现在使用的是 AsyncTask 而不是 loopj API,而且它似乎工作得很好。没有延迟。也将尝试改造。谢谢。
猜你喜欢
  • 2013-10-20
  • 2014-03-27
  • 1970-01-01
  • 2019-04-03
  • 2020-12-05
  • 2018-09-01
  • 1970-01-01
  • 2015-11-12
  • 2013-06-04
相关资源
最近更新 更多