2016-07-23 1 views
1

私のアンドロイドアプリでは、1つのクラスで5つのAPIを使用しているonCreateで1つずつ呼び出すが、それは速くするために自分のコードを最適化する方法、私のアプリケーションが遅くなります。どのように高速私のアンドロイドアプリを作る

私のコードは次のとおりです。

@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 
    } 

} 

私の質問は、1つ1つ呼び出すのではなく、同時にすべてのAPIを呼び出すことができます。私のコードを最適化するためのヒントを教えてください。 ありがとうございます

+1

あなたはすぐにそれらを呼び出すことができます。 Androidサポートマルチスレッド、それを使用します。 – Shubhank

+0

ありがとう@Shubhank。しかし、私はどのように私はプログラミングでは新しいですマルチスレッドを使用するか教えてくださいできますか?私はこのためにHandlerを試しましたが、結果は同じです。 –

+1

メインスレッドで長い処理をしないと、UIがブロックされます。 – Henry

答えて

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); 

    } 
} 
+0

これはまだちょっと後でメインスレッドでAPI呼び出しを実行します。 – Henry

+0

@Kenneth Hippolite –

+0

ありがとうございます。私のクライアントが私から期待しているものではありません。まあありがとう。 –

0

FetchDataクラスは何らかの種類の実行可能ファイルですか?それがasynctask(のように見える)の場合、問題はリスナーの配置にある可能性があります。 doInBackground以外のコールバックで呼び出すと、リスナーはUIスレッドに実行されます。すべてのapi呼び出しが非同期であっても、ボトルネックが作成されます。 パフォーマンスの低下の原因のもう1つは、実行待ちのタスクが多すぎます。このような問題を回避するには、runnablesを扱うときに専用のThreadPoolExecutorを使用し、asynctasksでexecuteOnExecutor(AsyncTask.ThreadPoolExecutor)メソッドを使用する方法があります。

呼び出しが非同期でない場合は、非同期にする必要があります。つまり、すべての非UI関連コードを分離された並列スレッドで実行するので、すべての呼び出しを行っている間はUIはブロックされません。具体的には、doInBackgroundメソッド(行994)でthis

(私は開発者です)をご覧ください。ご覧のとおり、この段階では、すべてのRestコールコード、シリアライゼーションコード、および非同期コールバックが実行されます。 onPostExecuteフェーズは、UIスレッドの作業負荷を軽減するために、同期リスナ(基本的にUI関連)のみを実行します。 FetchDataクラスでも同じことができます。

関連する問題