AsyncTask线程跳过循环

时间:2017-02-16 15:26:10

标签: android android-asynctask

编辑:

我自己用以下代码解决了这个问题:

    @Override
    protected void onPostExecute(String result) {
        loading.setVisibility(View.GONE);
        if (result!=null) {   //PREVENTS INTERNET CRASH!
            loadJSON(result);
            loadNext();
        }
    }

其中loadNext()触发新循环

private void loadNext() {
        link = link + 1;
        if (link < linksArray.length){
            new BackgroundTask().execute("" + names[link]);
        }
}

因此,我无法将任何答案标记为已接受,因为我尝试了它们没有成功。

问题在这里开始:

因此,我使用AsyncTask从不同的网站加载文本。这些网站列在一个数组中。在调用Asynctask时,我在onCreate方法中使用以下循环。

        for (int i = 0; i < linksArray.length; i++) {
            new BackgroundTask().execute("" + linksArray[i], "" + i);
        }

在“doInBackground”中我使用:params [0]

加载文本

我遇到的问题是,后台工作人员似乎跳过了一些链接,并且它做了两次链接。

示例:我可以得到这样的东西:1,2,3,4,4,6,7,8,8 当预期结果为0,1,2,3,4,5,6,7,8时

any1是否有任何解决方案。我一直在尝试在AsyncTask中创建循环,但是没有成功。在此先感谢:)

编辑:

    @Override
    protected String doInBackground(String... params) {
        try {

            json_url = params[0];
            number = Integer.parseInt(params[1]);
            System.out.println("test " + number);

            URL url = new URL(json_url);
            HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();

            httpURLConnection.setDoInput(true);
            InputStream inputStream = httpURLConnection.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuilder stringBuilder = new StringBuilder();
            String JSON_STRING;
            while((JSON_STRING = bufferedReader.readLine())!=null){
                stringBuilder.append(JSON_STRING+"\n");
            }
            bufferedReader.close();
            inputStream.close();
            httpURLConnection.disconnect();
            return stringBuilder.toString().trim();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
    }

    @Override
    protected void onPostExecute(String result) {
        loading.setVisibility(View.GONE);
        if (result!=null)   //PREVENTS INTERNET CRASH!
            loadJSON(result);
    }

}


public void loadJSON(String json_string) {
    JSONresult = json_string;
    System.out.println("test2 " + number);
}

使用此代码,输出变为:

    I/System.out: test 0
    I/System.out: test 1
    I/System.out: test2 1
    I/System.out: test 2
    I/System.out: test2 2
    I/System.out: test 3
    I/System.out: test2 3
    I/System.out: test 4
    I/System.out: test2 4
    I/System.out: test 5
    I/System.out: test2 5
    I/System.out: test2 5

2 个答案:

答案 0 :(得分:0)

您应该查看以下答案:Running multiple AsyncTasks at the same time -- not possible?

似乎AsyncTask使用的线程池在某些版本中的最大大小为5,而在以后的版本中,它的处理器数量为+。

为了允许更多线程,你应该这样做:

@TargetApi(Build.VERSION_CODES.HONEYCOMB) // API 11
void startMyTask(BackgroundTask asyncTask, String... params) {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
        asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
    else
        asyncTask.execute(params);
}

你应该这样做:

for (int i = 0; i < linksArray.length; i++) {
    startMyTask(new BackgroundTask(), "" + linksArray[i], "" + i);
}

答案 1 :(得分:0)

首先尝试使用控制台在非asynctask中加载文本以查看结果,也许这不是后台工作者的问题,当您阅读文本时,它可能是您逻辑中的内容。如果您向我们展示该代码,那么为了找到问题的根源将会有所帮助

修改 所以我认为正确的方法是将数组发送到asyncTask

new BackgroundTask().execute(linksArray);

让它完成所有工作

@Override
protected ArrayList<String> doInBackground(String[]... params) {
    try {
        String[] json_urls = paramas[0];
        //create array list that contains json strings
        ArrayList<String> json_strings = new ArrayList<String>();

        for (int i = 0; i < json_urls.length; i++) {
            json_url = json_urls[i];
            number = i;
            System.out.println("test " + number);

            URL url = new URL(json_url);
            HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();

            httpURLConnection.setDoInput(true);
            InputStream inputStream = httpURLConnection.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuilder stringBuilder = new StringBuilder();
            String JSON_STRING;
            while((JSON_STRING = bufferedReader.readLine())!=null){
                stringBuilder.append(JSON_STRING+"\n");
            }
            bufferedReader.close();
            inputStream.close();
            httpURLConnection.disconnect();
            json_strings.add(stringBuilder.toString().trim());
        }
        return json_strings;
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

@Override
protected void onPostExecute(ArrayList<String> result) {
    loading.setVisibility(View.GONE);
    if (result!=null)   //PREVENTS INTERNET CRASH!
        loadJSON(result);
}
}

public void loadJSON(ArrayList<String> json_strings) {
    for (int i = 0; i < json_strings.size(); i++) {
        JSONresult = json_strings.get(i);
        System.out.println("test2 " + i);
    }
}

另外,不要忘记更改asyncTask声明,如下所示:

public class BackgroundTask extends AsyncTask<String[], Void, ArrayList<String>>{
//your methods here
}