如何快速我的Android应用程序

时间:2016-07-23 05:45:15

标签: java android json oop optimization

在我的Android应用程序中,我在单个类中使用5个API,在onCreate中逐个调用它们,但它使我的应用程序速度变慢,如何优化我的代码以使其快速。

我的代码是这样的。

In [76]: N=4
In [77]: M=np.arange(N*N*N*N).reshape(N*N,N*N)
In [80]: a=np.array([0,1,0,1])
In [81]: A=np.einsum('i,j',a,a)
In [82]: A
Out[82]: 
array([[0, 0, 0, 0],
       [0, 1, 0, 1],
       [0, 0, 0, 0],
       [0, 1, 0, 1]])

In [83]: M[:N, :N]*A
Out[83]: 
array([[ 0,  0,  0,  0],
       [ 0, 17,  0, 19],
       [ 0,  0,  0,  0],
       [ 0, 49,  0, 51]])

In [84]: c=sparse.csr_matrix(M)[:N,:N].multiply(sparse.csr_matrix(A))
In [85]: c.data
Out[85]: array([17, 19, 49, 51], dtype=int32)

In [89]: [M[index] for index, a in np.ndenumerate(A) if a]
Out[89]: [17, 19, 49, 51]

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

3 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分: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);

    }
}

答案 2 :(得分:0)

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

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

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