以ArrayList作为返回类型的AsyncTask

问题描述 投票:0回答:1

我正在尝试从AsyncTask返回ArrayList。但是在主要活动中,我无法获取返回的arraylist。我想知道调用asynctask的方法,以便我可以获取返回的arraylist。

这是AsyncTask-

public class GetBannerDB extends AsyncTask<Void, Void, ArrayList<String>> {

GetBannerDB() {
}

@Override
protected ArrayList<String> doInBackground(Void... params) {
    InputStream is = null;
    ArrayList<String> bannerList =  new ArrayList<String>();

    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    nameValuePairs.add(new BasicNameValuePair("data", "data"));

    try {
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost("url to fetch data");
        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        HttpResponse response = httpClient.execute(httpPost);

        HttpEntity entity = response.getEntity();

        is = entity.getContent();

        BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 8);
        StringBuilder sb = new StringBuilder();

        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        serverResult = sb.toString().trim();

        try {
            String sResult = serverResult.substring(0, 7);

            if (sResult.equalsIgnoreCase("success")) {
                // Creating user login session
                // Use user real data
                String[] temp = serverResult.split("\\^");

                String banner_image = temp[1];
                String banner_redirect = temp[2];

                bannerList.add(banner_image);
                bannerList.add(banner_redirect);

            } else {

            }
        } catch (NullPointerException ex) {

        }

    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return bannerList;
}

@Override
protected void onPostExecute(ArrayList<String> result) {
    super.onPostExecute(result);
    mBannerTask = null;
}
}

在MainActivity中,我将输出称为-

ArrayList<String> adDetails = new ArrayList<>();

mBannerTask = new GetBannerDB();
adDetails = mBannerTask.execute();

但是在这里我得到了错误-类型不兼容。

我在哪里出错,请指导。

根据您的回答,我做了以下更改-

OnDataListener.java(作为接口)

public interface OnDataListener {
    void setData(ArrayList<String> result);
}

在MainActivity.java中-

public class PushAds implements OnDataListener{
    String serverResult = null;
    private GetBannerDB mBannerTask = null;
    ArrayList<String> adDetails = new ArrayList<>();

    public void displayAds()
    {
        mBannerTask  = new GetBannerDB(new OnDataListener {

            public void setData(ArrayList<String> result){

                adDetails   = result;
            }

        });
        mBannerTask.execute();
    }
    ......
}

但是它给出了错误。

java android
1个回答
0
投票
public interface OnDataListner{
  void setData(ArrayList<String> result); 
 }

public class GetBannerDB extends AsyncTask<Void, Void, ArrayList<String>> {
   public OnDataListner dataListner;

  GetBannerDB(OnDataListner dataListner) { 
      this.dataListner = dataListner;
  }

   @Override
  protected void onPostExecute(ArrayList<String> result) {
    super.onPostExecute(result);
    dataListner.setData(result);

  }
}

最终

    ArrayList<String> adDetails = new ArrayList<>();

   mBannerTask  = new GetBannerDB(new OnDataListner{

     @Overrid
    public void setData(ArrayList<String> result){

         adDetails   = result;
         //do something

        }

  });
 mBannerTask.execute();
© www.soinside.com 2019 - 2024. All rights reserved.