Android ViewPager在后台加载数据(asynctask vs thread + handler)

时间:2014-08-22 10:47:46

标签: android multithreading user-interface android-asynctask handler

我正在使用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();
   }

}

1 个答案:

答案 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]);
   }

}