安卓:AsyncTask的UI更新问题 [英] Android: AsyncTask UI update issue
本文介绍了安卓:AsyncTask的UI更新问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在下面的code,我试图创建一个 ListActivity
。
此列表中的元素正在被自定义 ArrayAdapter
填充 - OrderAdapter
提取机制的所有元素是AsyncTask的类中。
我能够toset的元素 m_adapter
,但无法更新列表的用户界面。
该活动得到力关闭。
code:
公共类SoftwarePassionView扩展ListActivity { 私人ProgressDialog m_progressDialog = NULL;
私人的ArrayList<排序> m_orders = NULL;
私人OrderAdapter m_adapter; //下面定义
私人的Runnable viewOrders; @覆盖
保护无效的onCreate(捆绑savedInstanceState){
尝试{
super.onCreate(savedInstanceState);
的setContentView(R.layout.softwarepassionview);
m_adapter =新OrderAdapter(SoftwarePassionView.this,
R.layout.row,m_orders); 新AsyncOperation()执行(); }赶上(例外五){
Toast.makeText(这一点,e.toString(),Toast.LENGTH_SHORT).show();
}
} 公共类OrderAdapter扩展ArrayAdapter<排序> { 私人的ArrayList<排序>项目; 公共OrderAdapter(上下文的背景下,INT textViewResourceId,
ArrayList的<排序>元素){
超级(上下文,textViewResourceId,要素);
this.items =元素;
} 公共无效SETLIST(ArrayList的<排序>项){
this.items =新的ArrayList<排序>();
this.items.addAll(项目); } @覆盖
公共查看getView(INT位置,查看convertView,父母的ViewGroup){
super.getView(位置,convertView,父母);
视图V = convertView;
尝试{
如果(V == NULL){
LayoutInflater VI =(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
V = vi.inflate(R.layout.row,NULL);
}
为了O = items.get(位置);
如果(O!= NULL){
TextView的ORDERNAME =(TextView的)V
.findViewById(R.id.topText);
TextView的orderStatus =(TextView的)V
.findViewById(R.id.bottomText);
orderName.setText(o.getOrderName());
orderStatus.setText(o.getOrderStatus());
}
}赶上(例外五){
Toast.makeText(SoftwarePassionView.this,e.toString(),
Toast.LENGTH_SHORT).show();
}
返回伏;
}
} 公共类AsyncOperation扩展的AsyncTask { @覆盖
在preExecute保护无效(){
super.on preExecute();
} @覆盖
保护对象doInBackground(对象... PARAMS){
getOrders();
如果(m_orders =空&放大器;!&放大器; m_orders.size()大于0){
m_adapter.setList(m_orders);
}
返回null;
} @覆盖
保护无效onPostExecute(对象结果){
super.onPostExecute(结果);
m_adapter.notifyDataSetChanged();
setListAdapter(m_adapter);
}
} 私人无效getOrders(){
尝试{
m_orders =新的ArrayList<排序>();
为了O1 =新订单();
o1.setOrderName(T恤购买);
o1.setOrderStatus(调度);
为了O2 =新订单();
o2.setOrderName(迪奥购买);
o2.setOrderStatus(待定);
m_orders.add(01);
m_orders.add(02); 视频下载(2000);
}赶上(例外五){
Toast.makeText(这一点,e.toString(),Toast.LENGTH_SHORT).show();
}
}}
解决方案
我有修复的错误现在就来试试
公共类SoftwarePassionView扩展ListActivity {私人ProgressDialog m_progressDialog = NULL;
私人的ArrayList<排序> m_orders =新的ArrayList<排序>(); //你为什么把它空?
私人OrderAdapter m_adapter; //下面定义
私人的Runnable viewOrders;@覆盖
保护无效的onCreate(捆绑savedInstanceState){
尝试{
super.onCreate(savedInstanceState);
的setContentView(R.layout.softwarepassionview);
m_adapter =新OrderAdapter(SoftwarePassionView.this,
R.layout.row,m_orders);
setListAdapter(m_adapter); //你正在为NPE你没有初始化m_orders
新AsyncOperation()执行(); }赶上(例外五){
Toast.makeText(这一点,e.toString(),Toast.LENGTH_SHORT).show();
}
}公共类OrderAdapter延伸BaseAdapter { 私人的ArrayList<排序>项目=新的ArrayList<排序>(); 公共OrderAdapter(上下文的背景下,INT textViewResourceId,
ArrayList的<排序>元素){
//超级(上下文,textViewResourceId,要素);
this.items =元素;
} 公共无效SETLIST(ArrayList的<排序>项){
this.items.clear();
this.items.addAll(项目);
this.notifyDataSetChanged(); } @覆盖
公共查看getView(INT位置,查看convertView,父母的ViewGroup){
super.getView(位置,convertView,父母);
视图V = convertView;
尝试{
如果(V == NULL){
LayoutInflater VI =(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
V = vi.inflate(R.layout.row,NULL);
}
为了O = items.get(位置);
如果(O!= NULL){
TextView的ORDERNAME =(TextView的)V
.findViewById(R.id.topText);
TextView的orderStatus =(TextView的)V
.findViewById(R.id.bottomText);
orderName.setText(o.getOrderName());
orderStatus.setText(o.getOrderStatus());
}
}赶上(例外五){
Toast.makeText(SoftwarePassionView.this,e.toString(),
Toast.LENGTH_SHORT).show();
}
返回伏;
}公众诠释的getCount(){ 返回this.items.size();
}公共对象的getItem(INT为arg0){
// TODO自动生成方法存根
返回this.items.get(为arg0);
}众长getItemId(INT为arg0){
// TODO自动生成方法存根
返回0;
}}公共类AsyncOperation扩展的AsyncTask { @覆盖
在preExecute保护无效(){
super.on preExecute();
} @覆盖
保护对象doInBackground(对象... PARAMS){
getOrders();
//如果(m_orders = NULL&放大器;!&安培; m_orders.size()0){NO NEAD在此处设置列表
// m_adapter.setList(m_orders);
//}
返回null;
} @覆盖
保护无效onPostExecute(对象结果){ 如果(m_orders =空&放大器;!&放大器; m_orders.size()大于0){
m_adapter.setList(m_orders);
}
super.onPostExecute(结果);
// setListAdapter(m_adapter);
}
}私人无效getOrders(){
尝试{
m_orders =新的ArrayList<排序>();
为了O1 =新订单();
o1.setOrderName(T恤购买);
o1.setOrderStatus(调度);
为了O2 =新订单();
o2.setOrderName(迪奥购买);
o2.setOrderStatus(待定);
m_orders.add(01);
m_orders.add(02); 视频下载(2000);
}赶上(例外五){
Toast.makeText(这一点,e.toString(),Toast.LENGTH_SHORT).show();
}
}
}
In the code below, I'm trying to create a ListActivity
.
The elements of this list are being filled by a custom ArrayAdapter
- OrderAdapter.
All the element fetching mechanism is inside the AsyncTask class.
I'm able toset the elements in the m_adapter
, but not able to update the UI of List.
The activity is getting force closed.
Code:
public class SoftwarePassionView extends ListActivity {
private ProgressDialog m_progressDialog = null;
private ArrayList<Order> m_orders = null;
private OrderAdapter m_adapter; // Defined Below
private Runnable viewOrders;
@Override
protected void onCreate(Bundle savedInstanceState) {
try {
super.onCreate(savedInstanceState);
setContentView(R.layout.softwarepassionview);
m_adapter = new OrderAdapter(SoftwarePassionView.this,
R.layout.row, m_orders);
new AsyncOperation().execute();
} catch (Exception e) {
Toast.makeText(this, e.toString(), Toast.LENGTH_SHORT).show();
}
}
public class OrderAdapter extends ArrayAdapter<Order> {
private ArrayList<Order> items;
public OrderAdapter(Context context, int textViewResourceId,
ArrayList<Order> elements) {
super(context, textViewResourceId, elements);
this.items = elements;
}
public void setList(ArrayList<Order> items) {
this.items = new ArrayList<Order>();
this.items.addAll(items);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
super.getView(position, convertView, parent);
View v = convertView;
try {
if (v == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row, null);
}
Order o = items.get(position);
if (o != null) {
TextView orderName = (TextView) v
.findViewById(R.id.topText);
TextView orderStatus = (TextView) v
.findViewById(R.id.bottomText);
orderName.setText(o.getOrderName());
orderStatus.setText(o.getOrderStatus());
}
} catch (Exception e) {
Toast.makeText(SoftwarePassionView.this, e.toString(),
Toast.LENGTH_SHORT).show();
}
return v;
}
}
public class AsyncOperation extends AsyncTask {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Object doInBackground(Object... params) {
getOrders();
if (m_orders != null && m_orders.size() > 0) {
m_adapter.setList(m_orders);
}
return null;
}
@Override
protected void onPostExecute(Object result) {
super.onPostExecute(result);
m_adapter.notifyDataSetChanged();
setListAdapter(m_adapter);
}
}
private void getOrders() {
try {
m_orders = new ArrayList<Order>();
Order o1 = new Order();
o1.setOrderName("T-Shirt Purchase");
o1.setOrderStatus("Dispatched");
Order o2 = new Order();
o2.setOrderName("Deo Purchase");
o2.setOrderStatus("Pending");
m_orders.add(o1);
m_orders.add(o2);
Thread.sleep(2000);
} catch (Exception e) {
Toast.makeText(this, e.toString(), Toast.LENGTH_SHORT).show();
}
}
}
解决方案
I have fix error try now
public class SoftwarePassionView extends ListActivity {
private ProgressDialog m_progressDialog = null;
private ArrayList<Order> m_orders = new ArrayList<Order>(); //why you have putting it null?
private OrderAdapter m_adapter; // Defined Below
private Runnable viewOrders;
@Override
protected void onCreate(Bundle savedInstanceState) {
try {
super.onCreate(savedInstanceState);
setContentView(R.layout.softwarepassionview);
m_adapter = new OrderAdapter(SoftwarePassionView.this,
R.layout.row, m_orders);
setListAdapter(m_adapter); // you are getting npe as you have not init "m_orders"
new AsyncOperation().execute();
} catch (Exception e) {
Toast.makeText(this, e.toString(), Toast.LENGTH_SHORT).show();
}
}
public class OrderAdapter extends BaseAdapter {
private ArrayList<Order> items=new ArrayList<Order>();
public OrderAdapter(Context context, int textViewResourceId,
ArrayList<Order> elements) {
//super(context, textViewResourceId, elements);
this.items = elements;
}
public void setList(ArrayList<Order> items) {
this.items.clear();
this.items.addAll(items);
this.notifyDataSetChanged();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
super.getView(position, convertView, parent);
View v = convertView;
try {
if (v == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row, null);
}
Order o = items.get(position);
if (o != null) {
TextView orderName = (TextView) v
.findViewById(R.id.topText);
TextView orderStatus = (TextView) v
.findViewById(R.id.bottomText);
orderName.setText(o.getOrderName());
orderStatus.setText(o.getOrderStatus());
}
} catch (Exception e) {
Toast.makeText(SoftwarePassionView.this, e.toString(),
Toast.LENGTH_SHORT).show();
}
return v;
}
public int getCount() {
return this.items.size();
}
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return this.items.get(arg0);
}
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
}
public class AsyncOperation extends AsyncTask {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Object doInBackground(Object... params) {
getOrders();
// if (m_orders != null && m_orders.size() > 0) { NO nead to set list here
// m_adapter.setList(m_orders);
// }
return null;
}
@Override
protected void onPostExecute(Object result) {
if (m_orders != null && m_orders.size() > 0) {
m_adapter.setList(m_orders);
}
super.onPostExecute(result);
//setListAdapter(m_adapter);
}
}
private void getOrders() {
try {
m_orders = new ArrayList<Order>();
Order o1 = new Order();
o1.setOrderName("T-Shirt Purchase");
o1.setOrderStatus("Dispatched");
Order o2 = new Order();
o2.setOrderName("Deo Purchase");
o2.setOrderStatus("Pending");
m_orders.add(o1);
m_orders.add(o2);
Thread.sleep(2000);
} catch (Exception e) {
Toast.makeText(this, e.toString(), Toast.LENGTH_SHORT).show();
}
}
}
这篇关于安卓:AsyncTask的UI更新问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文