2015-11-05 40 views
0

我怎样才能把它放到android的异步任务。该视图占据了主线程的大部分,所以我试图将它放在新线程中。我怎样才能使用异步任务

public View getView(final int position, View convertView, ViewGroup parent) { 

    ViewHolder holder = new ViewHolder(); 

    convertView = inflater.inflate(R.layout.gridview_layout, null); 
    holder.txt = (TextView) convertView.findViewById(R.id.txt); 
    holder.flag = (ImageView) convertView.findViewById(R.id.flag); 

    holder.txt.setText(result[position]); 
    holder.flag.setImageResource(imageId[position]); 

    convertView.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(context, DetailActivity.class).putExtra(Intent.EXTRA_TEXT, result[position]); 
      context.startActivity(intent); 
     } 
    }); 

    return convertView; 
} 

另一个类是这样的。我无法理解什么是使用主线程

public static class DetailFragment extends Fragment { 

    public DetailFragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_detail, container, false); 
     Intent intent = getActivity().getIntent(); 
     if (intent != null && intent.hasExtra(Intent.EXTRA_TEXT)) { 
      String forecastStr = intent.getStringExtra(Intent.EXTRA_TEXT); 
      ((TextView) rootView.findViewById(R.id.detail_text)).setText(forecastStr); 
     } 

     return rootView; 
    } 

} 
+0

对不起,我不能让你。 – vikky

+0

*“该视图占据了主线程的大部分”* - 是什么让你这么说?你有任何数据来支持这一说法吗?乍一看,我没有看到你给出的代码有什么大的错误(尽管你应该正确地应用ViewHolder模式和膨胀布局),也没有看起来像一个非常繁重的操作。 –

+0

这是logcat'1-06 02:06:14.625 17955-17955/com.example.vikky.basic_3 W/Resources:转换为字符串:TypedValue {t = 0x12/d = 0x0 a = 2 r = 0x7f0c006e} 11-06 02:06:15.927 17955-17955/com.example.vikky.basic_3 I /编舞:跳过了77帧!应用程序可能在其主线程上做了太多工作。 11-06 02:06:17.146 17955-17955/com.example.vikky.basic_3 I /编舞:跳过72帧!应用程序可能在其主线程上做了太多工作。 11-06 02:06:20.521 17955-17955/com.example.vikky.basic_3 W/Resources:转换为字符串:TypedValue {t = 0x12/d = 0x0 a = 2 r = 0x7f0c006d}' – vikky

回答

0

你是错的大部分,因为大部分与UI的操作应该是在主线程(和更新的用户界面应该总是在主线程)。

可能有另一个代码占用了大部分主线程(URL请求,从磁盘加载文件,数据解析等)。

但这里的AsyncTask使用的例子:

AsyncTask.execute(new Runnable() { 
    @Override 
    public void run() { 
     //code here 
    } 
}); 
+0

这是App中使用的另一个类。 – vikky

0

你没有正确使用ViewHolder模式。

ViewHolder模式的想法是限制布局通货膨胀的数量和昂贵的操作,如findViewById()。您的实现完全忽略convertView并且每次都膨胀新的布局!

如果您的布局很复杂,这可能会导致性能明显下降。

一个更好的实现是:

public View getView(final int position, View convertView, ViewGroup parent) { 

    final ViewHolder holder; 
    if (convertView != null) { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    else { 
     holder = new ViewHolder(); 
     convertView = inflater.inflate(R.layout.gridview_layout, parent, false); 
     holder.txt = (TextView) convertView.findViewById(R.id.txt); 
     holder.flag = (ImageView) convertView.findViewById(R.id.flag); 

     convertView.setTag(holder); 
    } 

    holder.txt.setText(result[position]); 
    holder.flag.setImageResource(imageId[position]); 

    convertView.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(context, DetailActivity.class).putExtra(Intent.EXTRA_TEXT, result[position]); 
      context.startActivity(intent); 
     } 
    }); 

    return convertView; 
} 

你也应该考虑使用ListView.setOnItemClickListener(),而不是创建的列表中的每个项目新OnClickListener

+0

更改代码后显示错误。 'E/AndroidRuntime:致命例外:main 11-06 15:09:47.272 12934-12934/com.example.vikky。basic_3 E/AndroidRuntime:进程:com.example.vikky.basic_3,PID:12934 11-06 15:09:47.272 12934-12934/com.example.vikky.basic_3 E/AndroidRuntime:java.lang.NullPointerException:尝试从空字段'android.widget.TextView com.example.vikky.basic_3.CustomAdapter $ ViewHolder.txt'读取空对象引用 11-06 15:09:47.272 1294-12934/com.example.vikky.basic_3 E/AndroidRuntime:在com.example.vikky.basic_3.CustomAdapter.getView(CustomAdapter.java:97)' – vikky

+0

啊!我忘了将持有人链接到视图!这已被纠正 – nicopico