我有一个同步逻辑,通过在doInBackgroud()
上运行的web服务将sendOrder从android中的db发送到服务器。
首先我开始使用app。
然后单击SyncClick
并同步数据库而不会出现错误。
之后我进入应用程序添加someorder到orderTable
返回主屏幕(具有SyncClick),然后再次单击SyncClick。
它发送命令(这意味着sendOrder()
函数运行良好)
之后重置数据库并获取doInBackgroud()
的最新数据。
但它得到了这个错误;
07-11 23:38:15.406: E/AndroidRuntime(7864): java.lang.RuntimeException: An error occured while executing doInBackground()
07-11 23:38:15.406: E/AndroidRuntime(7864): Caused by: java.lang.NullPointerException
启动应用后,点击SyncClick再次运行良好。所以在我添加一些订单然后同步后它不起作用但在没有添加任何订单的情况下运行良好。
寻找问题。 感谢您提前的时间。
public void SyncClick(View v)
{
Loading = (ImageView)findViewById(R.id.imgLoadingAnim);
LoadingLayout = (LinearLayout)findViewById(R.id.loLoadingAnim);
LoadingLayout.setVisibility(VISIBLE);
Loading.setBackgroundResource(R.drawable.loading);
frameAnimation= (AnimationDrawable)Loading.getBackground();
frameAnimation.setCallback(Loading);
frameAnimation.setVisible(true, true);
frameAnimation.start();
if(!this.dhn.isTableExists("Orders"))
{
updateDB();
}
sendOrder();
}
public void sendOrder()
{
ArrayList<Object[]> argumentsList = new ArrayList<Object[]>();
Object[] stuff = {this.dhn, this};
//SEND
ArrayList<Order> orders = this.dhn.GetOrders();
for(int i = 0 ; i < orders.size(); i++)
{
ArrayList<OrderItem> orderItems = this.dhn.GetOrderItems(orders.get(i).ID);
String orderItemsS = "";
for(int r = 0 ; r < orderItems.size(); r++)
{
orderItemsS = orderItemsS + orderItems.get(r).FinalCode + "|" + orderItems.get(r).Quantity + "|" +
orderItems.get(r).Price + "|" + orderItems.get(r).Discount + "|" + orderItems.get(r).Status + "|" + "#";
}
orderItemsS = orderItemsS.substring(0, orderItemsS.length() - 1);
Object[] arguments = {
new String("OrderAdd"),
stuff,
new String("UserId"),
new Integer (orders.get(i).UserId),
new String("int"),
new String("CustomerId"),
new Integer (orders.get(i).CustomerId),
new String("int"),
new String("Price"),
new Double (orders.get(i).Price),
new String("double"),
new String("Discount"),
new Double (orders.get(i).Discount),
new String("double"),
new String("Status"),
new Integer (orders.get(i).Status),
new String("int"),
new String("orderItems"),
new String (orderItemsS),
new String("String")
};
argumentsList.add(arguments);
}
Object[] stuffALL = {this.dhn, this, argumentsList};
Object[] argumentsALL = {
new String("recieveALL"),
stuffALL
};
//ConnectXML runXMLALL = new ConnectXML();
new ConnectXML().execute(argumentsALL);
Status = 1;
updateDB();
receive();
}
public void receive()
{
Object[] stuff = {this.dhn, this};
ArrayList<Object[]> argumentsList1 = new ArrayList<Object[]>();
//receive
Object[] arguments = {
new String("ProductListGet"),
stuff,
new String("CatID"),
new Integer (-1),
new String("int")
};
argumentsList1.add(arguments);
Object[] arguments1 = {
new String("CustomerListGet"),
stuff
};
argumentsList1.add(arguments1);
Object[] arguments2 = {
new String("CategoryListGet"),
stuff,
new String("ParentID"),
new Integer (-2),
new String("int")
};
argumentsList1.add(arguments2);
Object[] arguments3 = {
new String("UserListGet"),
stuff
};
argumentsList1.add(arguments3);
Object[] arguments5 = {
new String("ProductCategoriesListGet"),
stuff
};
argumentsList1.add(arguments5);
Object[] arguments6 = {
new String("ProductOptionListGet"),
stuff
};
argumentsList1.add(arguments6);
Object[] arguments7 = {
new String("FinalProductListGet"),
stuff
};
argumentsList1.add(arguments7);
Object[] arguments8 = {
new String("ProductDiscountsListGet"),
stuff
};
argumentsList1.add(arguments8);
Object[] arguments9 = {
new String("ProductPriceGroupListGet"),
stuff
};
argumentsList1.add(arguments9);
Object[] arguments10 = {
new String("OptionListGet"),
stuff
};
argumentsList1.add(arguments10);
Object[] stuffALL1 = {this.dhn, this, argumentsList1};
Object[] argumentsALL1 = {
new String("recieveALL"),
stuffALL1
};
//ConnectXML runXMLALL1 = new ConnectXML();
new ConnectXML().execute(argumentsALL1);
}
int Stat;
int Status;
public void LoadAnim()
{
if(Status == 1)
{
Stat++;
if(Stat > 0)
{
LoadingLayout.setVisibility(GONE);
if(frameAnimation !=null && frameAnimation.isRunning())
{
frameAnimation.stop();
Stat = 0;
Status = 0;
}
}
}
}
public void updateDB()
{
this.dhn.close();
try {
InputStream myInput;
myInput = getAssets().open("sistem.db");
// Path to the just created empty db
String outFileName = "/data/data/sistem.ss/databases/"
+ "sistem.db";
// Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
// transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
// Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
buffer = null;
outFileName = null;
this.dhn.close();
this.dhn = null;
this.dhn = DataHelper.getDataHelper(this);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
LogCat
07-12 07:31:59.879: E/AndroidRuntime(2873): FATAL EXCEPTION: AsyncTask #1
07-12 07:31:59.879: E/AndroidRuntime(2873): java.lang.RuntimeException: An error occured while executing doInBackground()
07-12 07:31:59.879: E/AndroidRuntime(2873): at android.os.AsyncTask$3.done(AsyncTask.java:200)
07-12 07:31:59.879: E/AndroidRuntime(2873): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
07-12 07:31:59.879: E/AndroidRuntime(2873): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
07-12 07:31:59.879: E/AndroidRuntime(2873): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
07-12 07:31:59.879: E/AndroidRuntime(2873): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-12 07:31:59.879: E/AndroidRuntime(2873): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
07-12 07:31:59.879: E/AndroidRuntime(2873): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
07-12 07:31:59.879: E/AndroidRuntime(2873): at java.lang.Thread.run(Thread.java:1096)
07-12 07:31:59.879: E/AndroidRuntime(2873): Caused by: java.lang.NullPointerException
07-12 07:31:59.879: E/AndroidRuntime(2873): at sistem.ss.ConnectXML.doInBackground(ConnectXML.java:79)
07-12 07:31:59.879: E/AndroidRuntime(2873): at sistem.ss.ConnectXML.doInBackground(ConnectXML.java:1)
07-12 07:31:59.879: E/AndroidRuntime(2873): at android.os.AsyncTask$2.call(AsyncTask.java:185)
07-12 07:31:59.879: E/AndroidRuntime(2873): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-12 07:31:59.879: E/AndroidRuntime(2873): ... 4 more
答案 0 :(得分:2)
我还没有机会使用AsyncTask,但documentation说:
该任务只能执行一次(如果尝试第二次执行则会抛出异常。)
这意味着您只需要创建一个新实例并在该实例上执行。 E.g。
new WhateverYourTaskIsCalled().execute(...);
而不是在您已经使用的实例上调用execute()
。