如何确保执行AsyncTask

时间:2015-04-29 00:01:38

标签: java android android-asynctask picasso

我对Android开发很陌生,我觉得我在这里有一个相对简单的问题,并设法绑定更复杂的部分但忽略了更简单的部分。我已经设置了一个ImageAdapter类,它处理在我的另一个片段中将图像显示到GridView中。最初我正在按照一个教程简单地显示一个数组中的项目列表。

我使用AsyncTask填充ArrayList,然后将ArrayList转换为Picasso在显示内容时可以处理的标准数组。

我的问题是我的ImageAdapter的AsyncTask部分没有被执行,因此Picasso使用的imageArr[]只是保持空白。

如何确保我的适配器的AsyncTask部分实际执行?

我试过这个,但它似乎没有起作用,我觉得我有点不对......

    public void onCreate() {
    new GetProjects().execute();
}

我已经附上了我的代码,任何帮助都会非常感激!

请注意; ServiceHandler只是检索URL上的数据,然后将其转换为可以解析的字符串。

public class ImageAdapter extends BaseAdapter {


//JSON URL
private static String url = "www.myjsonsourceurl.com";

//JSON NODES

private static final String TAG_LOGO = "logopath";

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

String[] imageArr = imageUrls.toArray(new String[imageUrls.size()]);


private Context mContext;

public ImageAdapter(Context c) {
    mContext = c;
}

public int getCount() {
    return imageArr.length;
}

public Object getItem(int position) {
    return null;
}

public long getItemId(int position) {
    return 0;
}


public void onCreate() {
    new GetProjects().execute();
}


// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {

    ImageView imageView;
    if (convertView == null) {
        // if it's not recycled, initialize some attributes
        imageView = new ImageView(mContext);
        imageView.setLayoutParams(new GridView.LayoutParams(185, 185));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setPadding(3, 3, 3, 3);
    } else {
        imageView = (ImageView) convertView;
    }

    Picasso.with(mContext).setIndicatorsEnabled(true);
    Picasso.with(mContext).setLoggingEnabled(true);

    Picasso.with(mContext).load(imageArr[position]).placeholder(R.drawable.ajaxloader).error(R.drawable.imageunavailable).into(imageView);
    return imageView;
}

// references to our images
//ASYNC task to get json by making HTTP call
public class GetProjects extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // Nothing right now


    }

    @Override
    protected Void doInBackground(Void... arg0) {
        // Creating service handler class instance
        ServiceHandler sh = new ServiceHandler();

        // Making a request to url and getting response
        String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);

        Log.d("Response: ", "> " + jsonStr);

        if (jsonStr != null) {
            try {
                JSONArray json = new JSONArray(jsonStr);


                // looping through All Applications
                for (int i = 0; i < json.length(); i++) {

                    JSONObject p = json.getJSONObject(i);

                    String logopath = p.getString(TAG_LOGO);

                    imageUrls.add(logopath);

                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        } else {
            Log.e("ServiceHandler", "Couldn't get any data from the url");


        }

        return null;
    }


    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);


    }


}
}

2 个答案:

答案 0 :(得分:0)

您可以覆盖BaseAdapter的onCreate方法。执行你的代码

 new GetProjects().execute();

在contructor中或者从适配器外部手动调用onCreate函数(我建议更改其名称)。

答案 1 :(得分:0)

您需要调用活动或片段,其中列表的定义不在此类适配器中。将asynctask类移到您的活动中并从那里调用它。

AsyncTask提供方法 onPreExecute() onPostExecute(),您可以在其中播放任务已启动或已完成的消息。你应该在类的onPostExecute()中调用setAdapter()。