如何确保 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()
我是 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()