编辑:
我自己用以下代码解决了这个问题:
@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
答案 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
}