0

我意识到这通常是一个简单的问题,但我一直在查看此站点和其他站点上的其他类似问题,但无法修复代码,也无法准确查看错误来自何处。我的问题似乎是调用分配给按钮的 OnClickListener,但我又可能错了。我基本上是从另一个有效的应用程序中直接复制了这段代码(只做了很少的改动)。这个事实让我更加困惑。提前感谢您对这个相对简单的问题的帮助。

代码:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.update_activity);

    final Handler handler;
    handler = new Handler();

    final EditText getCustID = (EditText) findViewById(R.id.customer);
    final EditText custvar1 = (EditText) findViewById(R.id.var1);
    final EditText custvar2 = (EditText) findViewById(R.id.var2);
    final EditText custvar3 = (EditText) findViewById(R.id.var3);

    class sendGET implements Runnable
    {
        private String url;

        public sendGET(String mUrl)
        {
            url = mUrl;
        }

        public void run()
        {
            try
            {
                //Declare HttpClient and HttpGet
                HttpClient client = new DefaultHttpClient();
                HttpGet httpget = new HttpGet(url);

                //Run HttpGet
                client.execute(httpget);

            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    class getCustomerData implements Runnable
    {       
        public void run()
        {
            try
            {
                InputStream stream = null;
                XMLparser xmlParser = new XMLparser();
                List<Customer> customers = null;

                String parseUrl = URL + getCustID.getText().toString();

                try
                {
                    stream = downloadUrl(parseUrl);
                    customers = xmlParser.parse(stream);
                }
                finally
                {
                    stream.close();
                }

                final Customer data = customers.get(0);

                handler.post(new Runnable() {
                    public void run() {
                        custvar1.setText(String.valueOf(data.var1));
                        custvar2.setText(String.valueOf(data.var2));
                        custvar3.setText(String.valueOf(data.var3));
                    }
                });
            }
            catch (IOException e)
            {
                //return getResources().getString(R.string.connection_error);
            }
            catch (XmlPullParserException e)
            {
                //return getResources().getString(R.string.xml_error);
            }
        }

        private Customer readCustomer(XmlPullParser parser) throws XmlPullParserException, IOException
        {
            parser.require(XmlPullParser.START_TAG, null, "customer");
            String custID = null;
            String var1 = null;
            String var2 = null;
            String var3 = null;

            while(parser.next() != XmlPullParser.END_TAG)
            {
                if (parser.getEventType() != XmlPullParser.START_TAG)
                {
                    continue;
                }
                String name = parser.getName();
                if (name.equals("CustID"))
                {
                    custID = readCustID(parser);
                } else if (name.equals("custvar1"))
                {
                    var1 = readVar1(parser);
                } else if (name.equals("custvar2"))
                {
                    var2 = readVar2(parser);
                } else if (name.equals("custvar3"))
                {
                    var3 = readVar3(parser);
                } else
                {
                    skip(parser);
                }

            }
            return new Customer(custID, var1, var2, var3);
        }

        private String readCustID(XmlPullParser parser) throws IOException, XmlPullParserException
        {
            parser.require(XmlPullParser.START_TAG, null, "CustID");
            final String custID = readText(parser);
            parser.require(XmlPullParser.END_TAG, null, "CustID");
            return custID;
        }

        private String readVar1(XmlPullParser parser) throws IOException, XmlPullParserException
        {
            parser.require(XmlPullParser.START_TAG, null, "custvar1");
            String var1 = readText(parser);
            parser.require(XmlPullParser.END_TAG, null, "custvar1");
            return var1;
        }

        private String readVar2(XmlPullParser parser) throws IOException, XmlPullParserException
        {
            parser.require(XmlPullParser.START_TAG, null, "custvar2");
            String var2 = readText(parser);
            parser.require(XmlPullParser.END_TAG, null, "custvar2");
            return var2;
        }

        private String readVar3(XmlPullParser parser) throws IOException, XmlPullParserException
        {
            parser.require(XmlPullParser.START_TAG, null, "custvar3");
            String var3 = readText(parser);
            parser.require(XmlPullParser.END_TAG, null, "custvar3");
            return var3;
        }

        private String readText(XmlPullParser parser) throws IOException, XmlPullParserException
        {
            String result = "";
            if (parser.next() == XmlPullParser.TEXT)
            {
                result = parser.getText();
                parser.nextTag();
            }
            return result;
        }

        private void skip(XmlPullParser parser) throws IOException, XmlPullParserException
        {
            if (parser.getEventType() != XmlPullParser.START_TAG)
            {
                throw new IllegalStateException();
            }
            int depth = 1;
            while (depth != 0)
            {
                switch (parser.next()) {
                case XmlPullParser.END_TAG:
                    depth --;
                case XmlPullParser.START_TAG:
                    depth++;
                    break;
                }
            }
        }

        class XMLparser
        {       
            public List<Customer> parse(InputStream in) throws XmlPullParserException, IOException {
                try
                {
                    XmlPullParser parser = Xml.newPullParser();
                    parser.setInput(in, null);
                    parser.nextTag();
                    return readXML(parser);
                } finally {
                    in.close();
                }
            }

            private List<Customer> readXML(XmlPullParser parser) throws XmlPullParserException, IOException
            {
                List<Customer> custData = new ArrayList<Customer>();

                parser.require(XmlPullParser.START_TAG, null, "xml");
                while (parser.next() != XmlPullParser.END_TAG)
                {
                    if (parser.getEventType() != XmlPullParser.START_TAG)
                    {
                        continue;
                    }
                    String name = parser.getName();

                    //Look for customer tag
                    if (name.equals("customer"))
                    {
                        custData.add(readCustomer(parser));
                    }
                    else
                    {
                        skip(parser);
                    }
                }

                return custData;
            }
        }

        private InputStream downloadUrl(String urlString) throws IOException
        {
            URL url = new URL(urlString);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(10000);
            conn.setConnectTimeout(15000);
            conn.setRequestMethod("GET");
            conn.setDoInput(true);

            //start the query
            conn.connect();
            InputStream stream = conn.getInputStream();
            return stream;
        }
    }

    final Button getData = (Button) findViewById(R.id.getData);
    getData.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v)
        {
            //Declare and start thread
            final Runnable mGetData = new getCustomerData();
            final Thread getData = new Thread(mGetData);
            getData.start();
        }
    });

    final Button submit = (Button) findViewById(R.id.Submit);
    submit.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            //set url
            String url = "**removed**";
            url += "var1=" + custvar1.getText().toString() + "&var2=" + custvar2.getText().toString() + "&var3=" + custvar3.getText().toString();

            //Declare and start thread
            final Runnable mConnect = new sendGET(url);
            final Thread Connect = new Thread(mConnect);
            Connect.start();
        }
    });
}

public class Customer
{
    public final String custID;
    public final String var1;
    public final String var2;
    public final String var3;

    private Customer()
    {
        custID = null;
        var1 = null;
        var2 = null;
        var3 = null;
    }

    private Customer(String custID, String var1, String var2, String var3)
    {
        this.custID = custID;
        this.var1 = var1;
        this.var2 = var2;
        this.var3 = var3;

    }
}

日志错误:

01-09 19:20:53.478: W/dalvikvm(911): threadid=11: thread exiting with uncaught exception (group=0x40a13300)
01-09 19:20:53.478: E/AndroidRuntime(911): FATAL EXCEPTION: Thread-99
01-09 19:20:53.478: E/AndroidRuntime(911): java.lang.NullPointerException
01-09 19:20:53.478: E/AndroidRuntime(911):  at us.rns.editdata.UpdateActivity$1getCustomerData.run(UpdateActivity.java:90)
01-09 19:20:53.478: E/AndroidRuntime(911):  at java.lang.Thread.run(Thread.java:856)
01-09 19:20:54.408: W/IInputConnectionWrapper(911): showStatusIcon on inactive InputConnection
4

1 回答 1

2

您的 downloadUrl 方法失败。

InputStream stream = null;
XMLparser xmlParser = new XMLparser();
List<Customer> customers = null;

String parseUrl = URL + getCustID.getText().toString();

try
{
    stream = downloadUrl(parseUrl);
    customers = xmlParser.parse(stream);
}
finally
{
    stream.close();
}

流对象设置为 null,然后您分配stream = downloadUrl(parseUrl).

downloadUrl 方法失败,没有为stream.

然后,您尝试关闭finally子句中的流。

private InputStream downloadUrl(String urlString) throws IOException
{
    URL url = new URL(urlString);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setReadTimeout(10000);
    conn.setConnectTimeout(15000);
    conn.setRequestMethod("GET");
    conn.setDoInput(true);

    //start the query
    conn.connect();
    InputStream stream = conn.getInputStream();
    return stream;
}

在这个方法上放一个断点,并通过它进行调试。请返回它正在中断的确切行。我怀疑是conn.connect();InputStream stream = conn.getInputStream();

我也会在 finally 子句中这样做:

finally
{
    if(stream != null)
        stream.close();
}

它也可能是以下内容:

您需要移动所有这些:

final EditText getCustID = (EditText) findViewById(R.id.customer);
final EditText custvar1 = (EditText) findViewById(R.id.var1);
final EditText custvar2 = (EditText) findViewById(R.id.var2);
final EditText custvar3 = (EditText) findViewById(R.id.var3);

final Button getData = (Button) findViewById(R.id.getData);

final Button submit = (Button) findViewById(R.id.Submit);

进入 onResume,而不是 onCreate()

于 2013-01-10T01:37:31.327 回答