我有一个正在尝试在ASUS eee TF101(未植根)上调试的应用程序,它无法正常工作。每当我在Esclipse中单击“调试”时,我的ASUS就会显示“应用程序....已意外停止。请重试。”错误信息。我可以在我的EVO(root用户)和DroidX(非root用户)上运行此程序,而不会出现任何问题。我确保所有适用的设置也都已应用(Setting up a Device for Development),但仍然无法使用。奇怪的是,如果我在onCreate事件的第二行代码中放置了一个断点,它甚至没有在此处中断:

boolean bNetworkConnected = true;


我认为一个简单的赋值语句可用于断点,但不会在断点处中断。

有什么想法吗?

更新

Maxim,我也无法在发布模式下运行它。我已经确保MainActivity是清单文件中指定的一项(请记住,它在我的evo和droidx上运行)。这是我在发布模式下运行时的LogCat副本:



02-14 10:31:21.107: D/dalvikvm(5934): GC_FOR_ALLOC freed 43K, 4% free 6370K/6595K, paused 40ms
02-14 10:31:21.117: I/dalvikvm-heap(5934): Grow heap (frag case) to 6.767MB for 513744-byte allocation
02-14 10:31:21.157: D/dalvikvm(5934): GC_FOR_ALLOC freed <1K, 4% free 6872K/7111K, paused 25ms
02-14 10:31:21.197: E/GetStringFromWebService ERROR-(5934): java.lang.RuntimeException: android.os.NetworkOnMainThreadException
02-14 10:31:21.207: E/GetStringFromWebService ERROR-(5934): java.lang.RuntimeException: android.os.NetworkOnMainThreadException
02-14 10:31:21.207: E/GetIntFromWebService ERROR-(5934): java.lang.RuntimeException: java.lang.NumberFormatException: Invalid int: "null"
02-14 10:31:21.207: E/GetStringFromWebService ERROR-(5934): java.lang.RuntimeException: android.os.NetworkOnMainThreadException
02-14 10:31:21.207: D/AndroidRuntime(5934): Shutting down VM
02-14 10:31:21.207: W/dalvikvm(5934): threadid=1: thread exiting with uncaught exception (group=0x40221760)
02-14 10:31:21.227: D/dalvikvm(5934): GC_CONCURRENT freed 67K, 3% free 6908K/7111K, paused 2ms+4ms
02-14 10:31:21.227: E/AndroidRuntime(5934): FATAL EXCEPTION: main
02-14 10:31:21.227: E/AndroidRuntime(5934): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.adacel.app/com.adacel.app.MainActivity}: java.lang.NullPointerException
02-14 10:31:21.227: E/AndroidRuntime(5934):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1815)
02-14 10:31:21.227: E/AndroidRuntime(5934):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831)
02-14 10:31:21.227: E/AndroidRuntime(5934):     at android.app.ActivityThread.access$500(ActivityThread.java:122)
02-14 10:31:21.227: E/AndroidRuntime(5934):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024)
02-14 10:31:21.227: E/AndroidRuntime(5934):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-14 10:31:21.227: E/AndroidRuntime(5934):     at android.os.Looper.loop(Looper.java:132)
02-14 10:31:21.227: E/AndroidRuntime(5934):     at android.app.ActivityThread.main(ActivityThread.java:4123)
02-14 10:31:21.227: E/AndroidRuntime(5934):     at java.lang.reflect.Method.invokeNative(Native Method)
02-14 10:31:21.227: E/AndroidRuntime(5934):     at java.lang.reflect.Method.invoke(Method.java:491)
02-14 10:31:21.227: E/AndroidRuntime(5934):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
02-14 10:31:21.227: E/AndroidRuntime(5934):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
02-14 10:31:21.227: E/AndroidRuntime(5934):     at dalvik.system.NativeStart.main(Native Method)
02-14 10:31:21.227: E/AndroidRuntime(5934): Caused by: java.lang.NullPointerException
02-14 10:31:21.227: E/AndroidRuntime(5934):     at com.adacel.app.MainActivity.GetLatestData(MainActivity.java:300)
02-14 10:31:21.227: E/AndroidRuntime(5934):     at com.adacel.app.MainActivity.LoadWithNetworkConnectivity(MainActivity.java:220)
02-14 10:31:21.227: E/AndroidRuntime(5934):     at com.adacel.app.MainActivity.onCreate(MainActivity.java:79)
02-14 10:31:21.227: E/AndroidRuntime(5934):     at android.app.Activity.performCreate(Activity.java:4397)
02-14 10:31:21.227: E/AndroidRuntime(5934):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
02-14 10:31:21.227: E/AndroidRuntime(5934):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779)
02-14 10:31:21.227: E/AndroidRuntime(5934):     ... 11 more


看起来好像在方法GetStringFromWebService上出错了。但是奇怪的部分是...。直到MainActivity中的更进一步时才进行该调用...我上面的赋值调用(bNetworkConnected = true)是代码的第二行,紧接在super.onCreate(savedInstance)之后。 ..so好像根本看不到我在此处设置的断点。

MainActivity代码

public static final String TAG = "SQLiteDebug";
private ListView mListViewIssues;

private static final String NameSpace = "RemoteWebService";
private static final String URL = "http://ws.simcare.biz/Service1.asmx";
private static final String DBVersionKey = "DBVersion";
private static final String PreferencesNotLoaded = "User Preferences could not be loaded. \n\nThis app will now close.";
private static final String CustomerCodeNotLoaded = "The Customer Code could not be loaded. \n\nThis app will now close.";
private static final String LocationShortNameNotLoaded = "The Location Short Name could not be loaded. \n\nThis app will now close.";
private static final String DBVersionNotLoaded = "The Database Version could not be loaded. \n\nThis app will now close.";
private static final String App_File = "app_file.xml";
private static final String AppNotConnectedTitle = "App Not Connected to Network";

Boolean ConnectedToNetwork = false;
TextView tvFooter;
int DBVersion = 1;
IssueInfoCreator creator;
AppPreferences appPrefs = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.footer_layout);

    //For testing network connectivity only.
    boolean bNetworkConnected = true;

    //If there's a network connection available, get latest data.
    //if(NetworkUtils.getInstance(this).isOnline(this)){
    if(bNetworkConnected){
        //Load data from web service and get latest data.
        LoadWithNetworkConnectivity();
    }
    else{
        InputStream isAppFile = null;
          try {
              isAppFile = getBaseContext().getAssets().open(App_File);
        } catch (IOException e) {
            ShowMessageAndClose(PreferencesNotLoaded);
            return;
        }

        Scanner scanner = new Scanner(isAppFile);
        String sScannerContents = scanner.useDelimiter("\\A").next();
        Document doc = XMLfunctions.XMLfromString(sScannerContents);

        try{
            if(LoadPreferences(doc))
                DBVersion = Integer.valueOf(appPrefs.getDBVersion());
        }catch(Exception ex){
            Log.e("INT PARSE ERROR", ex.getStackTrace().toString());
        }

        //Load data from local db only.
        LoadWithoutNetworkConnectivity();
    }

    //Load listview control.
    setContentView(R.layout.main);

    //Setup Refresh button listener.
    Button btn = (Button) findViewById(R.id.btnRefresh);
    btn.setOnClickListener(btnRefreshClick);

    final Context context = getBaseContext();
    mListViewIssues = (ListView)findViewById(R.id.listIssues);

    //Load Footer View.
    View footerView =((LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.footer_layout, null, false);
    tvFooter = (TextView)footerView.findViewById(R.id.footerText);
    tvFooter.setText("DBVersion = " + String.valueOf(DBVersion));
    mListViewIssues.addFooterView(footerView);

    creator = new IssueInfoCreator(this, DBVersion);
    creator.open();

    //add data to listview through adapter.
    mListViewIssues.setAdapter(new IssueInfoAdapter(this, creator.queryAll()));

    creator.close();
 }


LoadWithNetworkConnectivity代码:

private void LoadWithNetworkConnectivity(){
    //Set the Titlebar to the stored value in the DB.
    String SoapAction = "RemoteWebService/GetApplicationTitle";
    String MethodName = "GetApplicationTitle";
    setTitle(GetStringFromWebService(NameSpace, MethodName, SoapAction, URL, "ApplicationName", "AndroidApp"));

    //Get the DBVersion.
    SoapAction = "RemoteWebService/GetDBVersion";
    MethodName = "GetDBVersion";
    DBVersion = GetIntFromWebService(NameSpace, MethodName, SoapAction, URL, "ApplicationName", "AndroidApp");

    //Write DBVersion to Preferences.
    Editor ePreferences = this.getPreferences(Context.MODE_PRIVATE).edit();
    ePreferences.putInt(DBVersionKey, DBVersion);
    ePreferences.commit();

    //Get Issues for this Customer/Location.
    SoapAction = "RemoteWebService/GetOpenIssues";
    MethodName = "GetOpenIssues";
    SoapPrimitive xmlData = GetDataFromWebService(NameSpace, MethodName, SoapAction, URL, "ApplicationName", "AndroidApp");

    try {
        GetLatestData(xmlData);
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    } catch (SAXException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    //Set flag.
    ConnectedToNetwork = true;
}


GetDataFromWebService代码:

public SoapPrimitive GetDataFromWebService(String NameSpace, String MethodName, String SoapAction, String URL, String argName, String argValue){
    try {
        SoapObject request = new SoapObject(NameSpace, MethodName);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

        envelope.dotNet = true;

        request.addProperty(argName, argValue);

        if(MethodName == "GetOpenIssues")
        {
          request.addProperty("CustomerCode", "ABC");
          request.addProperty("LocationShortName", "KBIF");
        }

        envelope.setOutputSoapObject(request);
        androidHttpTransport.call(SoapAction, envelope);

        SoapPrimitive responseData = (SoapPrimitive) envelope.getResponse();
        return responseData;
    }
    catch (Exception e) {
        Log.e("GetStringFromWebService ERROR-", new RuntimeException(e).toString());
        return null;
    }
}


GetLatestData代码:

public void GetLatestData(SoapPrimitive xml)throws ParserConfigurationException, SAXException, IOException{
    //get the factory
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

    //Using factory get an instance of document builder
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc;

    //parse using builder to get DOM representation of the XML file
    InputSource is = new InputSource(new StringReader(xml.toString()));
    doc = db.parse(is);

   //Clear out Issues table first.
   creator = new IssueInfoCreator(this, DBVersion);
   creator.open();
   creator.ClearIssueTable();
   creator.close();

   NodeList nodes = doc.getElementsByTagName("Table");

   for(int i = 0; i < nodes.getLength(); i++) {
       IssueInfo issue = new IssueInfo();

       Element e = (Element)nodes.item(i);

       issue.setIssueNumber(Long.parseLong(XMLfunctions.getValue(e, "IssueID")));
       issue.setIssueSummary(XMLfunctions.getValue(e, "IssueSummary"));
       issue.setDateReceived(DateFormat.format("MM/dd/yyyy hh:mm:ss", System.currentTimeMillis()).toString());

       if(issue.getIssueNumber() > 0 && issue.getIssueSummary() != null){
           creator = new IssueInfoCreator(this, DBVersion);
           creator.open();
           creator.InsertIssue(issue.getIssueNumber(), issue.getDateReceived(), issue.getIssueSummary());
           creator.close();
       }
   }
}


那里是您要求的代码。...总之,应用程序启动,检查是否存在有效的网络连接(在这种情况下,我只是放了一个bool标志,因此我不必一直拔下电缆或断开连接wifi以使其正常工作/不工作),并运行适当的方法。我将标志设置为true,以便它调用LoadWithNetworkConnectivity()方法。...此方法转至我们的.NET Web服务,并获取应用程序标题,DBVersion和OpenIssues。然后,在此方法中,它调用“ GetLatestData”方法,并将XML解析为我创建的Issue对象。同样,所有这些都可以在模拟器,evo和droidx上找到,而不仅仅是我的ASUS平板电脑。

更新#2-解决方案

我跳过了尝试使我的平板电脑调试的工作,并为3.2 OS创建了一个模拟器(我之前在2.3.3模拟器上运行它)。因此,现在我可以调试并查看错误的出处。似乎在第一行中首先出错:

setTitle(GetStringFromWebService(NameSpace, MethodName, SoapAction, URL, "ApplicationName", "AndroidApp"));


如果将其放在字符串中,它将返回null,而我在LogCat中得到的错误是:

02-14 16:01:21.177: E/GetStringFromWebService ERROR-(510): java.lang.RuntimeException: android.os.NetworkOnMainThreadException


就像Maxim所说的那样,您必须将网络连接放在自己的线程上。 Android SDK文档也对NetworkOnMainThreadException进行了说明。它说的不真实...在较旧的平台上允许使用,但在Honeycomb及更高版本上不允许,这就是ASUS平板电脑正在运行的原因,这就是错误发生的原因。

感谢Maxim帮助我!一旦获得将网络事件置于其自己的线程上的代码,我将尝试更新此文章,以便其他人知道。

最佳答案

从LogCat错误中说出可以隐藏问题的位置。


无法启动活动ComponentInfo {com.adacel.app/com.adacel.app.MainActivity}:java.lang.NullPointerException,这意味着您在某处获得null作为对象并尝试从该null中获取某些东西。
同样是ERROR-(5934):java.lang.RuntimeException:java.lang.NumberFormatException:无效的int:“ null”。
NetworkOnMainThreadException(网络调用在主线程中完成)


首先,由于(NetworkOnMainThreadException),请确保WebService调用在单独的线程中完成。其次,您将从服务中获取正确的数据。看看LoadWithNetworkConnectivity()

关于android - Eclipse无法在ASUS eee TF101上进行调试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9278943/

10-16 09:13