【发布时间】:2015-07-30 19:16:40
【问题描述】:
我有一项活动,我将从 API 调用中获取信息。我知道 android 的主线程,并且知道我不应该重载它。我尝试使用线程,但我认为对于应用程序的复杂性,Asynctask 将是最好的方法。
我目前正在使用Thread().run(),但它仍然返回“跳过 x 帧,主线程中的工作太多”。我想知道如何将 Asynctask 类添加到我的应用程序以获得更好的性能。我的活动使用 ExpandableListView。
Home.java:
public class Home extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.home_act);
init();
}
void init() {
findViews();
changeFont();
clickListeners();
assignConditions("category", "all", "1");
categoryAllApiCall();
}
void categoryAllApiCall() {
RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint(base_url).setLogLevel(RestAdapter.LogLevel.FULL).build();
final Category_All category_all = restAdapter.create(Category_All.class);
category_all.getFeed(file, operation_condition, all_condition, max_depth_condition, new Callback<CategoryPojo>() {
@Override
public void success(CategoryPojo categoryPojo, Response response) {
progressBar.setVisibility(View.GONE);
final CategoryPojo category = categoryPojo;
new Thread(new Runnable() {
@Override
public void run() {
category_id = Arrays.copyOf(category.getCategoryId(), category.getCategoryId().length);
category_name = Arrays.copyOf(category.getCategoryName(), category.getCategoryName().length);
parent_id = Arrays.copyOf(category.getParentId(), category.getParentId().length);
}
}).run();
prepareListData();
setAdapter();
}
@Override
public void failure(RetrofitError error) {
tv_title_header.setText(error.getMessage());
progressBar.setVisibility(View.GONE);
}
});
}
private void prepareListData() {
listDataHeader = new ArrayList<String>();
listDataChild = new HashMap<String, List<String>>();
int count = -1;
for (int i = 0; i < category_id.length; i++) {
List<String> child = new ArrayList<String>();
if (parent_id[i].equals("0")) {
count++;
listDataHeader.add(category_name[i]);
for (int j = 0; j < category_id.length; j++) {
if (parent_id[j].equals(category_id[i])) {
child.add(category_name[j]);
}
}
listDataChild.put(listDataHeader.get(count), child);
}
}
}
void setAdapter() {
elv_home_body_lay.setAdapter(new HomeExpandableListAdapter(this, listDataHeader, listDataChild));
elv_home_body_lay.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
int previousGroup = -1;
@Override
public void onGroupExpand(int groupPosition) {
if (groupPosition != previousGroup) {
elv_home_body_lay.collapseGroup(previousGroup);
}
previousGroup = groupPosition;
}
});
elv_home_body_lay.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
Intent intent = new Intent(Home.this, ProductListing.class);
Bundle bundle = new Bundle();
bundle.putString("operation_condition", "productlisting");
bundle.putString("catids_condition", category_id[childPosition]);
bundle.putString("catname", category_name[childPosition]);
bundle.putString("start_row_condition", "0");
bundle.putString("limit_condition", "10");
intent.putExtras(bundle);
startActivity(intent);
return false;
}
});
}
}
HomeExpandableListAdapter.java
public class HomeExpandableListAdapter extends BaseExpandableListAdapter
{
private Context context;
private List<String> listDataHeader;
private HashMap<String, List<String>> listDataChild;
public HomeExpandableListAdapter(Context context, List<String> listDataHeader, HashMap<String, List<String>> listChildData) {
this.context = context;
this.listDataHeader = listDataHeader;
this.listDataChild = listChildData;
}
@Override
public Object getChild(int groupPosition, int childPosititon)
{
return this.listDataChild.get(this.listDataHeader.get(groupPosition)).get(childPosititon);
}
@Override
public long getChildId(int groupPosition, int childPosition)
{
return childPosition;
}
@Override
public View getChildView(int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent)
{
final String childText = (String) getChild(groupPosition, childPosition);
if (convertView == null) {
LayoutInflater infalInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.home_child_items_lay, null);
}
TextView txtListChild = (TextView) convertView.findViewById(R.id.lblListItem);
txtListChild.setTypeface(EasyFonts.robotoLight(context));
txtListChild.setText(childText);
return convertView;
}
@Override
public int getChildrenCount(int groupPosition)
{
return this.listDataChild.get(this.listDataHeader.get(groupPosition)).
size();
}
@Override
public Object getGroup(int groupPosition)
{
return this.listDataHeader.get(groupPosition);
}
@Override
public int getGroupCount()
{
return this.listDataHeader.size();
}
@Override
public long getGroupId(int groupPosition)
{
return groupPosition;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent)
{
String headerTitle = (String) getGroup(groupPosition);
if (convertView == null)
{
LayoutInflater infalInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.home_group_items_lay, null);
}
TextView lblListHeader = (TextView) convertView.findViewById(R.id.lblListHeader);
ImageView img=(ImageView)convertView.findViewById(R.id.imageView1);
lblListHeader.setTypeface(EasyFonts.robotoBold(context));
lblListHeader.setText(headerTitle);
if(isExpanded)
{
img.setImageResource(R.drawable.ic_remove_grey_36pt_2x);
}
if(!isExpanded)
{
img.setImageResource(R.drawable.ic_add_grey_36pt_2x);
}
return convertView;
}
@Override
public boolean hasStableIds()
{
return false;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition)
{
return true;
}
}
上述代码暂时有效,但会降低应用性能。如何使用 Asynctask 类在后台运行所有处理并创建可扩展的列表视图而不会重载 ui 线程。
【问题讨论】:
标签: java android multithreading android-asynctask