2017-01-19 3 views
0

私のアプリケーションでは、両方ともAPI呼び出しを行う2つの非同期タスクがあります。Android:私の非同期タスクはUIスレッドで実行されており、アプリケーションが停止しています

まず、asynctask1は、URLエンドポイントをヒット、そして私は私が私の次の(ドッシリ)asynctaskでヒットする必要がありますどのように多くのカテゴリごとにページアウト解析します。例:私の最初のasynctaskは私が私のデータを取得するためにヒットするため、{上記の配列の合計}異なるエンドポイントが存在することになることを意味し、私はそこで、基本的

int[] arr = {1,5,12,40,1,0,40...,6} 

のように見えるの配列を取得します。

この配列は、その後、私のasynctask2に渡ります。 Asynctask2には2つのforループがあります。外側forloopは、各カテゴリ(26のカテゴリ、アルファベットの各文字ごとに1つのカテゴリがあります)です。内側のforループは、上記の配列によってそのカテゴリにリストされているページの数に応じてカテゴリの各ページに移動します。

私はasynctask2で300のAPI呼び出しのようなものを作っています。何らかの理由で、これはバックグラウンドで実行する必要がありますが、これは私のUIスレッドを駄目にしているようです。以下は

asynctask2ための私のコード(WARNING:結果として起きるために醜いコード)で、ここで、要求ごと

public class ItemDatabaseUpdater extends AsyncTask<ArrayList<Integer>, Void, ArrayList<Item>> { 

private String apiRoute = "http://services.runescape.com/m=itemdb_oldschool/api/catalogue/items.json?category=1&alpha="; 
private String apiLetter = "b"; 
private String apiRoutePage = "&page="; 
private String apiPageNumber = "1"; 
private String data; 
private ArrayList<Item> itemDB = new ArrayList<>(); 
private JSONParser jsonParser = new JSONParser(); 
private JSONArray jsonArray; 
private String[] alphabet = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", 
     "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"}; 
private Item _item; 

protected void onPreExecute() {} 

protected ArrayList<Item> doInBackground(ArrayList<Integer>... args) { 
    ArrayList<Integer> pageNumbersForEachLetter = getTotalPageCountForEachLetter(args[0]); 
    for (int i=0; i<pageNumbersForEachLetter.size(); i++){ 
     apiLetter = alphabet[i]; 
     for (int j=1; j<pageNumbersForEachLetter.get((i))+1; j++){ 
      apiPageNumber = String.valueOf(j); 
      try { 
       String endRoute = apiRoute + apiLetter + apiRoutePage + apiPageNumber; 
       URL url = new URL(endRoute); 
       HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
       try { 
        BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 
        StringBuilder stringBuilder = new StringBuilder(); 
        String dataEntry; 
        while ((dataEntry = br.readLine()) != null) { 
         stringBuilder.append(dataEntry).append("\n"); 
        } 
        br.close(); 
        data = stringBuilder.toString(); 

        jsonArray = jsonParser.extractArrayFromObject(data, "items"); 
        for(int k=0; k<jsonArray.length(); k++) { 
         JSONObject obj = jsonParser.extractObjectFromArray(jsonArray, k); 
         JSONObject currentDataObj = jsonParser.extractObjectFromObject(obj, "current"); 
         JSONObject todayDataObj = jsonParser.extractObjectFromObject(obj, "today"); 
         _item = new Item(); 
         _item.setIconUrl(jsonParser.extractValueFromObject(obj,"icon")); 
         _item.setId(jsonParser.extractValueFromObject(obj,"id")); 
         _item.setName(jsonParser.extractValueFromObject(obj,"name")); 
         _item.setCurrentPrice(jsonParser.extractValueFromObject(currentDataObj,"price")); 
         _item.setPriceChangeToday(jsonParser.extractValueFromObject(todayDataObj,"price")); 
         _item.setTrendToday(jsonParser.extractValueFromObject(todayDataObj,"trend")); 
         itemDB.add(_item); 
        } 
       } 
       finally{ 
        urlConnection.disconnect(); 
       } 
      } 
      catch (Exception e){return null;} 
     } 
    } 
    return itemDB; 
} 

protected void onPostExecute(ArrayList<String> response) {} 

private ArrayList<Integer> getTotalPageCountForEachLetter(ArrayList<Integer> arg){ 
    ArrayList<Integer> retArr = new ArrayList<>(); 
    for (int i : arg){ 
     retArr.add((int)(Math.ceil(i/12))); 
    } 
    return retArr; 
} 
} 

私はコール私asynctask2

try {itemDatabase = itemDatabaseUpdater.execute(itemCatagoryNumbers).get();} catch (Exception e){} 
+1

それでは、どのようにあなたは私のポストをチェック@EpicPandaForce AsyncTask – EpicPandaForce

+0

を呼んでください、私はちょうど私が私のasynctask呼び出す方法を示すためにそれを編集しました。ありがとう –

答えて

2

あなたは上のget()を呼び出す方法ですAsyncTask。これは、「タスクが完了するまで現在のスレッドを結びつける」と言う。あなたの現在のスレッドがメインのアプリケーションスレッドであるため、最初にAsyncTaskを使用することの価値を完全に排除するスレッドをブロックしています。

get()コールを削除します。メインアプリケーションのスレッドで呼び出されるonPostExecute()のタスクの結果を使用して、そこでUIを更新することは安全です。

+0

これは私の問題を修正しました。ありがとうございました! –

関連する問題