Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:我的异步任务正在ui线程上运行,并暂停我的应用程序_Android_Api_Android Asynctask_Ui Thread - Fatal编程技术网

Android:我的异步任务正在ui线程上运行,并暂停我的应用程序

Android:我的异步任务正在ui线程上运行,并暂停我的应用程序,android,api,android-asynctask,ui-thread,Android,Api,Android Asynctask,Ui Thread,在我的应用程序中,我有两个异步任务,它们都进行API调用 首先,asynctask1命中一个url端点,我解析出下一个(更强大的)asynctask需要命中的每个类别的页面数。我的第一个异步任务将得到一个数组 int[] arr = {1,5,12,40,1,0,40...,6} 所以基本上,这意味着有{上述数组之和}不同的端点供我点击以获取数据 然后,该数组通过我的asynctask2。Asynctask2有两个for循环。外部forloop用于每个类别(有26个类别,字母表中每个字母对应一

在我的应用程序中,我有两个异步任务,它们都进行API调用

首先,asynctask1命中一个url端点,我解析出下一个(更强大的)asynctask需要命中的每个类别的页面数。我的第一个异步任务将得到一个数组

int[] arr = {1,5,12,40,1,0,40...,6}
所以基本上,这意味着有{上述数组之和}不同的端点供我点击以获取数据

然后,该数组通过我的asynctask2。Asynctask2有两个for循环。外部forloop用于每个类别(有26个类别,字母表中每个字母对应一个类别)。内部for循环根据上面的数组为该类别列出的页面数遍历该类别的每个页面

我在asynctask2中进行了大约300个API调用。出于某种原因,这似乎让我的UI线程陷入困境,即使它应该在后台运行

下面是我的asynctask2代码(警告:接下来的代码很难看)

您正在对
AsyncTask
调用
get()
。这表示“在任务完成之前绑定当前线程”。由于当前线程是主应用程序线程,因此您正在阻止该线程,这从一开始就完全消除了使用
AsyncTask
的价值

删除
get()
调用。在主应用程序线程上调用的
onPostExecute()
中使用任务的结果,因此在那里更新UI是安全的。

您正在
异步任务上调用
get()
。这表示“在任务完成之前绑定当前线程”。由于当前线程是主应用程序线程,因此您正在阻止该线程,这从一开始就完全消除了使用
AsyncTask
的价值


删除
get()
调用。在主应用程序线程上调用的
onPostExecute()
中使用任务的结果,因此可以安全地在那里更新UI。

那么如何调用AsyncTask@EpicPandaForce查看我的帖子,我只是编辑它来显示如何调用我的asynctask。谢谢你怎么称呼这个名字AsyncTask@EpicPandaForce查看我的帖子,我只是编辑它来显示如何调用我的asynctask。谢谢这解决了我的问题。非常感谢。这解决了我的问题。非常感谢。
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;
}
}
try {itemDatabase = itemDatabaseUpdater.execute(itemCatagoryNumbers).get();} catch (Exception e){}