2017-06-14 100 views
0

我想从AsyncTask类中的API中获取数据并将数据返回到数据在RecyclerView中显示的片段。但数据总是空的,片段总是空的。asynctask类没有返回数据片段

看看我的代码。

我的AsyncTask类:

public class EmployeesData extends AsyncTask<Void, Void, List<Employee>>{ 

List<Employee> data = new ArrayList<>(); 
EmployeesFragment emp; 

public EmployeesData (EmployeesFragment emp){ 
    this.emp= emp; 
} 


@Override 
protected List<Employee> doInBackground(Void... arg0) { 
    RestService restService = new RestService(); 
    try { 

     restService.getService().getEmployees(new Callback<List<Employee>>() { 

      @Override 
      public void success(List<Employee> employee, Response response) { 

       data = employee; 
      } 

      @Override 
      public void failure(RetrofitError error) { 
       Toast.makeText(emp.getContext(), error.getMessage().toString(), Toast.LENGTH_LONG).show(); 
      } 
     }); 
    } catch (Exception ex) { 
     Toast.makeText(emp.getContext(), ex.getMessage().toString(), Toast.LENGTH_LONG).show(); 

    } 
    return data; 
} 

@Override 
protected void onPostExecute(List<Employee> data) { 
    super.onPostExecute(data); 
    emp.setList(data); 
} 
} 

我的片段:

public class EmployeesFragment extends Fragment { 

RecyclerView rv; 
List<Employee> employees= new ArrayList<>(); 
public EmployeesFragment() { 
    // Required empty public constructor 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_employees, container, false); 

    rv = (RecyclerView) view.findViewById(R.id.emp_Rv); 
    rv.setLayoutManager(new LinearLayoutManager(getContext())); 

    fireYourAsyncTask(); 


    EmployeesRvAdapter adapter = new EmployeesRvAdapter (employees, getActivity()); 

    rv.setAdapter(adapter); 

    return view; 
} 

public void setList(List<Employee> data) { 
    employees= data; 
} 

public void fireYourAsyncTask() { 
    new EmployeesData(this).execute(); 
} 
} 

我RecyclerView适配器:

public class EmployeesRvAdapter extends RecyclerView.Adapter<EmployeesRvAdapter.EmployeesHolder> { 
List<Employees> employees; 
LayoutInflater inflater; 
Context context; 
public class EmployeesHolder extends RecyclerView.ViewHolder { 
    TextView name, description; 
    View container; 
    public EmployeesHolder(View itemView) { 
     super(itemView); 
     name = (TextView) itemView.findViewById(R.id.name_tv); 
     description = (TextView) itemView.findViewById(R.id.description_tv); 
     container = itemView.findViewById(R.id. item_root); 
    } 
} 
public EmployeesRvAdapter(List<Employees> employees, Context c) { 
    this.inflater = LayoutInflater.from(c); 
    this.employees = employees; 
    context = c; 
} 
@Override 
public EmployeesRvAdapter.EmployeesHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    View v = inflater.inflate(R.layout.employees_rv_item, parent, false); 
    return new EmployeesRvAdapter.EmployeesHolder(v); 
} 
@Override 
public void onBindViewHolder(final EmployeesRvAdapter.EmployeesHolder holder, int position) { 
    Employees employee = Employees.get(position); 
    holder.name.setText(employee.getName()); 
    holder.description.setText(employee.getDescription()); 
} 
@Override 
public int getItemCount() { 
    return employees.size(); 
} 
} 

我RestService类:

public class RestService { 
private static final String URL = "http://localhost:23000/"; 
private retrofit.RestAdapter restAdapter; 
private EmployeesService apiService; 

public RestService() 
{ 
    restAdapter = new retrofit.RestAdapter.Builder() 
      .setEndpoint(URL) 
      .setLogLevel(retrofit.RestAdapter.LogLevel.FULL) 
      .build(); 

    apiService = restAdapter.create(EmployeesService.class); 
} 

public EmployeesService getService() 
{ 
    return apiService; 
} 
} 

我的员工服务接口:

public interface EmployeesService { 
    @GET("/api/employees") 
    public void getEmployees(Callback<List<Employee>> callback); 
} 

可有人点我要去的地方错了吗?我会很感激帮助。

谢谢

回答

1

首先,你不需要与改造的的AsyncTask。

这可能仅仅是这

private EmployeesRvAdapter adapter; 

public void fireYourAsyncTask() { 

    EmployeesService service = new RestService().getService(); 
    try { 

     service.getEmployees(new Callback<List<Employee>>() { 

      @Override 
      public void success(List<Employee> employee, Response response) { 
       employees.clear(); 
       employees.addAll(employee); 
       adapter.notifyDatSetChanged(); 
      } 

      @Override 
      public void failure(RetrofitError error) { 
       Toast.makeText(emp.getContext(), error.getMessage().toString(), Toast.LENGTH_LONG).show(); 
      } 
     }); 

它更干净外观,如果你这样做,但是这取决于你

public class EmployeesFragment extends Fragment implements Callback<List<Employee>> { 

而且通过更清洁,我的意思是它只是

public void fireYourAsyncTask() { 
    EmployeesService service = new RestService().getService(); 
    service.getEmployees(this); 
} 

无论你在哪里添加t他的数据,这不是你如何添加到ArrayList

employees= data; 

这是重新分配。这是增加

employees.clear(); 
employees.addAll(data); 
+0

谢谢。它工作完美。你能告诉我们如何将这些数据作为缓存数据存储在API中,以便我们即使在离线时也能访问它? – vinitpradhan18

+0

简短回答:SQLite,Realm数据库或Firebase。尽管如此,请随意发布一个单独的问题 –