1

私はAndroidで小さなアプリケーションを構築しました.XMLプルパーサーを使用して、URLを使用してxmlファイルからデータを取得しました.問題は、エミュレータでアプリをテストすると正常に動作するが、実際のデバイスでテストするとアプリケーションが予期せず停止したことを示しています。強制終了します。何が原因でしょうか?助けてください。

08-20 16:07:30.070 E/AndroidRuntime(10349): FATAL EXCEPTION: main
08-20 16:07:30.070 E/AndroidRuntime(10349): java.lang.IllegalArgumentException
08-20 16:07:30.070 E/AndroidRuntime(10349): at org.kxml2.io.KXmlParser.setInput(KXmlParser.java:1615)
08-20 16:07:30.070 E/AndroidRuntime(10349): at com.example.androidsample4.UNIXclass.getEventsFromAnXML(UNIXclass.java:84)
08-20 16:07:30.070 E/AndroidRuntime(10349): at com.example.androidsample4.UNIXclass$1.onClick(UNIXclass.java:54)
08-20 16:07:30.070 E/AndroidRuntime(10349): at android.view.View.performClick(View.java:3131)
08-20 16:07:30.070 E/AndroidRuntime(10349): at android.view.View$PerformClick.run(View.java:12035)
08-20 16:07:30.070 E/AndroidRuntime(10349): at android.os.Handler.handleCallback(Handler.java:587)
08-20 16:07:30.070 E/AndroidRuntime(10349): at android.os.Handler.dispatchMessage(Handler.java:92)
08-20 16:07:30.070 E/AndroidRuntime(10349): at android.os.Looper.loop(Looper.java:132)
08-20 16:07:30.070 E/AndroidRuntime(10349): at android.app.ActivityThread.main(ActivityThread.java:4123)
08-20 16:07:30.070 E/AndroidRuntime(10349): at java.lang.reflect.Method.invokeNative(Native Method)
08-20 16:07:30.070 E/AndroidRuntime(10349): at java.lang.reflect.Method.invoke(Method.java:491)
08-20 16:07:30.070 E/AndroidRuntime(10349): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
08-20 16:07:30.070 E/AndroidRuntime(10349): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
08-20 16:07:30.070 E/AndroidRuntime(10349): at dalvik.system.NativeStart.main(Native Method)
08-20 16:07:30.080 W/ActivityManager( 2900):   Force finishing activity com.example.androidsample4/.UNIXclass

これをlogcatで取得する

package com.example.androidsample4;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class UNIXclass extends Activity 
{
    String unixcommands[];

    AutoCompleteTextView actv1;
    static final String URL="http://cympac.com/apps/xmlfile.xml";
    static final String KEY_COMMAND = "command"; // parent node
    static final String KEY_WORD = "word";
    static final String KEY_EXPLANATION = "explanation";


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv1=(TextView)findViewById(R.id.textView1);
        AutoCompleteTextView actv=(AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
        Button b1=(Button)findViewById(R.id.button1);
        unixcommands=getResources().getStringArray(R.array.Commands);
        ArrayAdapter<String> adapter =new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_list_item_1,unixcommands);
        actv1 = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
        actv1.setThreshold(1);
        actv1.setAdapter(adapter);
        b1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) 
            {
                TextView myXmlContent = (TextView)findViewById(R.id.textView2);
                String stringXmlContent = null;
                try {
                    stringXmlContent = getEventsFromAnXML(getBaseContext());   //   54 line
                } catch (XmlPullParserException e) {
                    // TODO Auto-generated catch block
                    Toast.makeText(getBaseContext(), "error:"+e.getMessage(), Toast.LENGTH_SHORT).show();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    Toast.makeText(getBaseContext(), "error:"+e.getMessage(), Toast.LENGTH_SHORT).show();
                }
                myXmlContent.setText(stringXmlContent);

            }
        });
    }









    public String getEventsFromAnXML(Context baseContext) throws XmlPullParserException,IOException
    {
        StringBuffer stringBuffer=new StringBuffer();

        java.net.URL url=new java.net.URL("http://cympac.com/apps/xmlfile.xml");
        XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        XmlPullParser xpp=factory.newPullParser();
        xpp.setInput(getInputStream(url),"UTF_8");         //84 line
        int eventType = xpp.getEventType();
        String word = null;

        String tag;
        while ((eventType = xpp.next()) != XmlPullParser.END_DOCUMENT)
        {
            if(XmlPullParser.START_TAG==eventType)
            {
                tag=xpp.getName();
                //stringBuffer.append("\n"+tag);
                if (tag.equals("word"))
                {
                    eventType = xpp.next();
                    word = xpp.getText();
                }
                else if (tag.equals("explanation"))
                {
                    eventType = xpp.next();
                   //if ("cancel".equals(word))
                    if(actv1.getText().toString().equals(word))

                    {
                        stringBuffer.append("\n" + xpp.getText());
                    }
                }

            }

        }
        return stringBuffer.toString();



    }

これは私のコードです。IllegalArgument Exception が発生しています

    public InputStream getInputStream(java.net.URL url2) 
    {

        try
        {
            return url2.openConnection().getInputStream();
        }
        catch(Exception e)
        {
            return null;
        }
    }
}
4

2 に答える 2

0

デバイスでのみクラッシュする場合は、例外メッセージを文字列値に入れてアラートに表示すると便利です。

私は同じ問題を抱えていたので、デバイスで何が問題になっているのかを理解するのに役立ちました.

于 2012-08-20T10:19:39.503 に答える
0

パーサーに XML データを提供するときに、不正な引数を指定しています。ソースによると、null 値を渡します。

このスレッドを参照してください: IllegalArgumentException を示す "doInBackground()" を実行する

XML を KXmlParser.setInput メソッドに渡す行を示してください。

編集:あなたgetInputStream()は null を返しているため、パーサーは IllegalArgumentException をスローします。使用する前に url2 の値をログに記録して、null かどうかを確認します。他の質問で解決策として述べられているように、ストリームを直接渡すこともできます。

xpp.setInput(getInputStream(url), "UTF_8");

xpp.setInput(url.openConnection().getInputStream(), "UTF_8");

于 2012-08-20T11:19:33.827 に答える