我正在使用viewpager并在加载数据时显示带有progressbar(微调器)的布局。
我当前的架构使用带有回调的asynctask来在我的asynctask命中onPostExecute()时通知片段。
我使用了回调方法,因为如果我使用.get()方法,asynctask会停止异步,当asynctask位于doInBackGround()时,进度条会停止。 (如果我使用get来从doInBackground返回数据,它会阻止我的UI线程,所以我在片段中实现了一个接口并将其发送到asynctask并从onPostExecute调用该方法来通知已完成加载的片段)
对每个asynctask进行回调是非常恼火的,因为我有很多当时的东西而且我忘记了哪个是先排序的。
我使用asynctask通过php post和jSON从mySQL加载一些数据。
我的问题是我是否应该继续使用asynctask加载数据并使用回调来通知它已完成的片段,或者使用工作线程和处理程序来使用接收的数据更新UI。
public interface UpdateValuesAsyncResponse {
void updateFinish();
}
public class MyFragment extends Fragment implements UpdateValuesAsyncResponse{
new UpdateLocalDevices(this).execute();
@Override
public void updateFinish() {
continue();
}
}
public class UpdateLocalDevices extends AsyncTask<Void, Void, Void> {
public UpdateLocalDevices(UpdateValuesAsyncResponse asyncResponse, Context context) {
this.asyncResponse = asyncResponse;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
getFromMySQL();
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
asyncResponse.updateFinish();
}
}
答案 0 :(得分:0)
类似的东西:
首先我假设函数getFromMySQL();
返回对象,你可以用字符串或其他任何东西替换它,我假设你想要将这些对象添加到myList
你可以做你想要的逻辑,例如循环遍历列表并更新或...
public class MyFragment extends Fragment implements UpdateValuesAsyncResponse{
ArrayList<object> myList = new ArrayList<object>();
new UpdateLocalDevices(this).execute();
@Override
public void updateFinish() {
continue();
}
}
public class UpdateLocalDevices extends AsyncTask<Void, Void, Object> {
public UpdateLocalDevices(UpdateValuesAsyncResponse asyncResponse, Context context) {
this.asyncResponse = asyncResponse;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
return getFromMySQL();
}
@Override
protected void onPostExecute(Object result) {
super.onPostExecute(result);
myList.add(result[0]);
}
}