I am parsing data from URL in doInBackground and setting values to UI thread in onPostExecute. So my array ArrayList is global variable:
ArrayList<String> arraylist=new ArrayList<String>();
Now, i parse html in doInBackground and add values to global ArrayList , so when i return arraylist to onPostExecute ArrayList() is empty
Here is my code:
ArrayList<String> arraylist=new ArrayList<String>(); // global
new readtextfile21().execute(rezultat1);
public class readtextfile21 extends AsyncTask<String, ArrayList<String>, ArrayList<String>> {
@Override
protected ArrayList<String> doInBackground(String... params)
{
Ion.with(getActivity().getApplicationContext())
.load(rezultat1)
.asString()
.setCallback(new FutureCallback<String>() {
@Override
public void onCompleted(Exception e, String result) {
String htmlStringSlike = result.substring(result.indexOf("<!-- BEGIN .shortcode-content -->"), result.length());
int startPositionSlika=htmlStringSlike.indexOf("<div class=\"shortcode-content\">");
int endPositionSlika=startPositionSlika+"<div class=\"shortcode-content\">".length();
while (htmlStringSlike.substring(startPositionSlika, endPositionSlika).indexOf("<!-- END .shortcode-content -->") < 0) {
endPositionSlika++;
}
htmlStringSlike=htmlStringSlike.substring(startPositionSlika,endPositionSlika);
while(htmlStringSlike.length()>0){
startPositionSlika = htmlStringSlike.indexOf("src=");
if(startPositionSlika>0) {
String slikaUTekstu=null;
startPositionSlika+= "src=".length() + 1;
endPositionSlika = startPositionSlika;
while (htmlStringSlike.substring(startPositionSlika, endPositionSlika).indexOf(".jpg") < 0 && htmlStringSlike.substring(startPositionSlika, endPositionSlika).indexOf(".jpeg") < 0 && htmlStringSlike.substring(startPositionSlika, endPositionSlika).indexOf(".png") < 0) {
endPositionSlika++;
}
slikaUTekstu = htmlStringSlike.substring(startPositionSlika, endPositionSlika);
htmlStringSlike=htmlStringSlike.substring(endPositionSlika);
arraylist.add(slikaUTekstu);// when i log values are here
}
else break;
}
}
});
return arraylist;
}
@Override
protected void onPostExecute(ArrayList<String> result) {
System.out.println("u onpost" + result);
for(int i=0;i<result.size() ;i++){ // result size here is 0???
slikaTv[i] = (ImageView) v.findViewById(nizSlikaID[i]);
Picasso.with(getActivity()).load(result.get(i)) // programski slika u dodati layout
.into(slikaTv[i]);
v.findViewById(mLayoutIdArray[i]).setVisibility(View.VISIBLE);
}
}
protected void onProgressUpdate() {
}
protected void onPreExecute()
{
}
}
答案 0 :(得分:0)
请在doInBackground()方法中返回值之前检查arrayList的大小!
答案 1 :(得分:0)
Ino提供异步结果。这意味着您需要暂停/阻止当前线程,直到Ino请求完成。
但在这种情况下使用AsyncTask完全没必要。您可以将代码从onPostExecute移动到回调处理程序。
如果你想要异步解析HTML(你现在不这么做),你需要从Ino回调处理程序运行asynctask。
答案 2 :(得分:0)
使用下面的代码更改您的doInBackground()
方法,抱歉,但我从未使用过这个库,所以我可能会犯一些错误。
@Override
protected ArrayList<String> doInBackground(String... params)
{
try {
String result = Ion.with(getActivity().getApplicationContext())
.load(params[0])
.asString()
.get();
} catch (Exception e){
e.printStackTrace();
}
if (result != null){
String htmlStringSlike = result.substring(result.indexOf("<!-- BEGIN .shortcode-content -->"), result.length());
int startPositionSlika=htmlStringSlike.indexOf("<div class=\"shortcode-content\">");
int endPositionSlika=startPositionSlika+"<div class=\"shortcode-content\">".length();
while (htmlStringSlike.substring(startPositionSlika, endPositionSlika).indexOf("<!-- END .shortcode-content -->") < 0) {
endPositionSlika++;
}
htmlStringSlike=htmlStringSlike.substring(startPositionSlika,endPositionSlika);
while(htmlStringSlike.length()>0){
startPositionSlika = htmlStringSlike.indexOf("src=");
if(startPositionSlika>0) {
String slikaUTekstu=null;
startPositionSlika+= "src=".length() + 1;
endPositionSlika = startPositionSlika;
while (htmlStringSlike.substring(startPositionSlika, endPositionSlika).indexOf(".jpg") < 0 && htmlStringSlike.substring(startPositionSlika, endPositionSlika).indexOf(".jpeg") < 0 && htmlStringSlike.substring(startPositionSlika, endPositionSlika).indexOf(".png") < 0) {
endPositionSlika++;
}
slikaUTekstu = htmlStringSlike.substring(startPositionSlika, endPositionSlika);
htmlStringSlike=htmlStringSlike.substring(endPositionSlika);
arraylist.add(slikaUTekstu);// when i log values are here
} else {
break;
}
}
}
return arraylist;
}
答案 3 :(得分:0)
问题是&#34;返回arraylist&#34;而且你需要。
您的请求是异步的:
执行步骤: 第一:请求
Ion.with(getActivity().getApplicationContext())
.load(rezultat1)
.asString()
.setCallback(new FutureCallback<String>() {...}
第二:
return arraylist
最后一步:
public void onCompleted(Exception e, String result) {...}
因为请求是异步的:
setCallback(new FutureCallback<String>() {...}
将在返回后执行;
您可以将返回代码移至:
while(htmlStringSlike.length()>0){
...
}
return arraylist;
希望能帮到你。