【问题标题】:how to make fast my android app如何快速制作我的 android 应用程序
【发布时间】:2016-11-27 01:47:58
【问题描述】:

在我的 android 应用程序中,我在一个类中使用了 5 个 API,在 onCreate 中一个一个地调用它们,但这会使我的应用程序变慢,如何优化我的代码以使其更快。

我的代码是这样的。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

      API1();
      API2();
      API3();
      API4();
      API5();
   }

    // all the Apis are call in onCreate

  public void API1() {
            FetchData fetch = new FetchData(this);
            fetch.response = new FetchListener() {
        @Override
        public void fetchFinish(String output) {
            try {
                JSONObject jobjOUT = new JSONObject(output);

                JSONArray jsarray = jobjOUT.getJSONArray("details");

                for (int i = 0; i < jsarray.length(); i++) {
                    JSONObject obj = jsarray.getJSONObject(i);
                    String a = obj.getString("abc");
                }

            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    };
    try {
        fetch.execute("http://example.com/api/something.php?param=xyz");
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

  }
  public void API2() {
     // same code here
  }
  public void API3() {
     // same code here
  }
  public void API4() {
     // same code here
  }
  public void API5() {
     // same code here
  }

 }

我的问题是我可以同时调用所有 API 而不是一个一个调用它们。请给我一些优化代码的建议。 谢谢你

【问题讨论】:

  • 您可以立即致电他们。 Android 支持多线程,使用它。
  • 感谢@Shubhank。但是你能告诉我如何使用多线程我是编程新手。我为此尝试了 Handler,但结果相同。
  • 并且不要在主线程上做冗长的处理,否则会阻塞你的 UI。
  • 我使用 Log.e("abc" , result);在每一行之后都会减慢处理速度。

标签: java android json oop optimization


【解决方案1】:

您能否通过将 APIx() 调用放入可运行任务中来解决此问题?

class MyClass {

    public boolean ready = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        handler = new Handler();

        final Runnable r = new Runnable() {
            public void run() {
                API1();
                API2();
                API3();
                API4();
                ready = true;
            }
        };

        handler.postDelayed(r, 100);

    }
}

【讨论】:

  • 这仍然会在主线程上运行 API 调用,只是稍后。
  • 它工作正常,但不完全符合我的客户对我的期望。好的,谢谢。
【解决方案2】:

您的 FetchData 类是某种可运行对象吗?如果是异步任务(看起来像),问题可能出在监听器的位置上。如果您在除 doInBackground 之外的任何其他回调中调用它,则侦听器将在 UI 线程中执行。即使假设您所有的 api 调用都是异步的,也会产生瓶颈。 性能损失的另一个原因是有太多的任务等待执行。避免此类问题的一个好方法是在处理可运行对象时使用专用的 ThreadPoolExecutor,并在 asynctasks 中使用 executeOnExecutor(AsyncTask.ThreadPoolExecutor) 方法。

如果您的调用不是异步的,那么您必须使它们异步。这意味着,在一个单独的并行线程中执行所有与 UI 无关的代码,因此在您进行所有调用时 UI 不会被阻塞。看看this

(我是开发人员),特别是在 doInBackground 方法(第 994 行)。可以看到,所有的 Rest 调用代码、序列化代码和异步回调都是在这个阶段执行的。 onPostExecute 阶段仅执行同步侦听器(基本上与 UI 相关),以减少 UI 线程的工作量。您可以在 FetchData 类中执行完全相同的操作。

【讨论】:

    【解决方案3】:

    尝试使用thread pool executor 参考thisthis 学习和理解。通过使用thread pool executor,您可以同时运行多个任务,或者我们可以说是并行。

    private void startAsyncTaskInParallel(MyAsyncTask task) {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
            task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
        else
            task.execute();
    }
    

    【讨论】:

    • 这就是我要找的,让我试试这个\
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 2017-10-26
    • 1970-01-01
    相关资源
    最近更新 更多