在我的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而不是逐个调用它们。请给我一些优化我的代码的技巧。 谢谢
答案 0 :(得分:3)
尝试使用thread pool executor
请参考this和this进行学习和理解。使用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类中执行完全相同的操作。