調試我已經得到了我想要在我的華碩Eee TF101 (不根植)調試應用程序,它不工作。每當我在Esclipse中點擊「調試」,我的華碩顯示「應用程序....意外停止,請重試。」錯誤信息。我能夠在沒有任何問題的情況下在我的EVO(rooted)和DroidX(無根)上運行此操作。我已經確認所有適用的設置已被應用(Setting up a Device for Development),但它仍然不起作用。奇怪的部分是,如果我把一個斷點的代碼onCreate事件二號線,它甚至不破有:Eclipse將不會在華碩Eee TF101
boolean bNetworkConnected = true;
我想出一個簡單的賦值語句會爲斷點工作,但它不」在那裏打破。
關於發生了什麼的任何想法?
UPDATE
馬克西姆,我不能在釋放模式無論是運行它。我已經確定MainActivity是清單文件中指定的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)之後的第二行代碼。這就像它甚至沒有看到我在那裏設置的斷點。
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();
}
}
}
有你的要求....總之代碼,應用程序啓動後,檢查是否有一個有效的網絡連接(在這種情況下,我只是把一個布爾標誌所以我不必拔掉電纜或斷開我的無線網絡以使其工作/不工作),並運行適當的方法。我將該標誌設置爲true,以便它調用LoadWithNetworkConnectivity()方法....此方法發送到我們的.NET Web服務並獲取應用程序標題,DBVersion和OpenIssues。然後在這個方法中,它調用「GetLatestData」方法並將XML解析爲我創建的Issue對象。再次,所有這些工作都在模擬器,evo和droidx上找到,而不是我的華碩平板電腦。
更新#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
就像馬克西姆說,你必須把網絡的東西放在它自己的線程上。 Android SDK文檔還解釋了它NetworkOnMainThreadException。不真實的是它在那裏表達......它允許在較老的平臺上,但不能在Honeycomb及以上版本上運行,這就是華碩平板電腦正在運行的,這就是錯誤的原因。
感謝Maxim幫助我!一旦我得到代碼將網絡事件放在它自己的線程上,我會嘗試更新這篇文章,以便其他人知道。
微小的機會,設備出現問題,我可以調試TF101上的所有內容。當您的應用程序不在調試模式下運行時會崩潰嗎?它是你的主要推出活動嗎?如果沒有,你是否在Manifest文件中聲明瞭另一個活動? LogCat將在這裏幫助。 – Maxim 2012-02-14 15:14:43
你可以發佈你的'MainActivity'代碼嗎?特別是'com.adacel.app.MainActivity.GetLatestData'方法 – SERPRO 2012-02-14 16:13:07
無法啓動活動ComponentInfo {com.adacel.app/com.adacel.app.MainActivity}:java.lang.NullPointerException,這意味着你得到某處爲空作爲對象並試圖從null中獲取某些東西。另外ERROR-(5934):java.lang.RuntimeException:java.lang.NumberFormatException:無效int:「null」。首先確保WebService調用是在單獨的線程中完成的,因爲(NetworkOnMainThreadException)。其次,您從Service獲得正確的數據。看看LoadWithNetworkConnectivity() – Maxim 2012-02-14 18:05:23