如何加速我的安卓应用程序

4

在我的安卓应用程序中,我在一个类中使用了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,而不是一个一个地调用它们。请给我一些优化代码的建议。 谢谢


1
你可以同时调用它们。Android支持多线程,利用它。 - Shubhank
谢谢@Shubhank。但是你能告诉我如何使用多线程吗?我是编程新手。我尝试了Handler,但结果相同。 - Anurag Shrivastava
1
不要在主线程上进行冗长的处理,否则它会阻塞您的用户界面。 - Henry
我在每行代码后使用Log.e("abc", result);,这会使处理速度变慢吗? - Anurag Shrivastava
3个回答

3

尝试使用线程池执行器,请参考这个这个了解并理解。通过使用线程池执行器,您可以同时运行多个任务,或者我们可以说是并行执行。

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

这正是我所期待的,让我来试试看。 - Anurag Shrivastava

2

你可以通过将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调用,只是稍后一点。 - Henry
它运行良好,但不完全符合我的客户的期望。好的,谢谢。 - Anurag Shrivastava

0

你的FetchData类是某种可运行的吗?如果它是一个异步任务(看起来像),问题可能在于监听器的位置。如果你在doInBackground之外的任何其他回调中调用它,监听器将在UI线程中执行。即使假设所有的api调用都是异步的,也会创建瓶颈。

性能损失的另一个原因是有太多的任务等待执行。避免这样的问题的好方法是在处理可运行对象时使用专用的ThreadPoolExecutor,并在asynctasks中使用executeOnExecutor(AsyncTask.ThreadPoolExecutor)方法。

如果你的调用不是异步的,那么你必须使它们异步化。这意味着在一个分离的、并行的线程中执行所有非UI相关的代码,以便在进行所有调用时不会阻塞UI。看一下this

(我是开发人员),具体来说,在doInBackground方法(第994行)。正如您所看到的,所有的Rest调用代码、序列化代码和异步回调都在这个阶段执行。onPostExecute阶段仅执行同步监听器(与UI相关的基本上)以减轻UI线程的工作负载。您可以在FetchData类中完全做到同样的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接