如何确保 AsyncTask 被执行

How to make sure AsyncTask is executed

我是 Android 开发的新手,我觉得我这里有一个相对简单的问题,并且设法解决了更复杂的部分,但忽略了更简单的部分。我已经设置了一个 ImageAdapter class 来处理将图像显示到我的另一个片段中的 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);


    }


}
}

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

 new GetProjects().execute();

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

您需要调用 activity 或不在适配器中定义列表的片段,就像这样。将 asynctask class 移动到您的 activity 并从那里调用它。

AsyncTask给出方法 onPreExecute()onPostExecute() 您可以在其中吐司消息,表明任务已开始或已完成。你应该在 class.

的 onPostExecute() 中调用 setAdapter()