0

同期ロジックにより、AndroidのdbからサーバーにsendOrderが実行されるWebサービスによって作成されます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();
        }
    }

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
4

1 に答える 1

2

AsyncTaskを使用する機会はまだありませんが、ドキュメントには次のように記載されています。

タスクは1回だけ実行できます(2回目の実行が試行されると、例外がスローされます)。

つまり、新しいインスタンスを作成して、そのインスタンスで実行するだけです。例えば

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

execute()すでに使用したインスタンスを呼び出すのではなく。

于 2012-07-11T23:22:04.843 に答える