0

我有一个同步逻辑,使 sendOrder 从 android 中的 db 通过运行在doInBackgroud().

首先我启动应用程序。然后单击SyncClick它并同步数据库而不会出现错误。之后,我进入应用程序向 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();
        }
    }

日志猫

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
4

1 回答 1

2

我还没有机会使用 AsyncTask,但文档说:

该任务只能执行一次(如果尝试第二次执行将引发异常。)

这意味着您只需要创建一个新实例并在该实例上执行。例如

new WhateverYourTaskIsCalled().execute(...);

而不是调用execute()您已经使用过的实例。

于 2012-07-11T23:22:04.843 回答