好的,所以我有一个 AsyncTask 实例,它应该调用 Web 服务并返回 XML 文件的结果,但是每次执行代码时,我都会在每次出现“字符串”时收到一个空值,我不确定如何纠正这种情况。
XML 文件有效:
https://dl.dropboxusercontent.com/u/31771876/GetPhoneSettings-ST-rsp-eng.xml
但我似乎无法从中获取数据。
它导致了一个空指针异常——我正试图确定它的起源。
日志猫:
08-14 13:45:10.189: E/STDataSettings(784): java.lang.ClassCastException: libcore.net.http.HttpURLConnectionImpl cannot be cast to javax.net.ssl.HttpsURLConnection
08-14 13:45:10.189: W/System.err(784): java.lang.ClassCastException: libcore.net.http.HttpURLConnectionImpl cannot be cast to javax.net.ssl.HttpsURLConnection
08-14 13:45:10.189: W/System.err(784): at com.project.new.datasettings.UpdateActivity$NetworkTask.getQueryResults(UpdateActivity.java:355)
08-14 13:45:10.189: W/System.err(784): at com.project.new.datasettings.UpdateActivity$NetworkTask.doInBackground(UpdateActivity.java:257)
08-14 13:45:10.189: W/System.err(784): at com.project.new.datasettings.UpdateActivity$NetworkTask.doInBackground(UpdateActivity.java:1)
08-14 13:45:10.189: W/System.err(784): at android.os.AsyncTask$2.call(AsyncTask.java:287)
08-14 13:45:10.199: W/System.err(784): at java.util.concurrent.FutureTask.run(FutureTask.java:234)
08-14 13:45:10.199: W/System.err(784): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
08-14 13:45:10.209: W/System.err(784): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
08-14 13:45:10.269: W/System.err(784): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
08-14 13:45:10.331: W/System.err(784): at java.lang.Thread.run(Thread.java:856)
08-14 13:45:10.331: V/STDataSettings(784): java.lang.NullPointerException
08-14 13:45:10.379: W/System.err(784): java.lang.NullPointerException
08-14 13:45:10.389: W/System.err(784): at java.io.FilterInputStream.available(FilterInputStream.java:53)
08-14 13:45:10.549: W/System.err(784): at java.io.InputStreamReader.read(InputStreamReader.java:234)
08-14 13:45:10.549: W/System.err(784): at java.io.BufferedReader.fillBuf(BufferedReader.java:130)
08-14 13:45:10.549: W/System.err(784): at java.io.BufferedReader.readLine(BufferedReader.java:354)
08-14 13:45:10.549: W/System.err(784): at com.project.new.datasettings.UpdateActivity$NetworkTask.doInBackground(UpdateActivity.java:262)
08-14 13:45:10.549: W/System.err(784): at com.project.new.datasettings.UpdateActivity$NetworkTask.doInBackground(UpdateActivity.java:1)
08-14 13:45:10.549: W/System.err(784): at android.os.AsyncTask$2.call(AsyncTask.java:287)
08-14 13:45:10.559: W/System.err(784): at java.util.concurrent.FutureTask.run(FutureTask.java:234)
08-14 13:45:10.559: W/System.err(784): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
08-14 13:45:10.559: W/System.err(784): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
08-14 13:45:10.621: W/System.err(784): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
08-14 13:45:10.689: W/System.err(784): at java.lang.Thread.run(Thread.java:856)
08-14 13:45:16.224: V/In the parser(784): now
08-14 13:45:16.229: W/System.err(784): org.xml.sax.SAXException: No input specified.
08-14 13:45:16.239: W/System.err(784): at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:288)
08-14 13:45:16.239: W/System.err(784): at com.project.new.datasettings.XmlParserHandlerFinal.getQueryResponse(XmlParserHandlerFinal.java:169)
08-14 13:45:16.239: W/System.err(784): at com.project.new.datasettings.UpdateActivity.success(UpdateActivity.java:426)
08-14 13:45:16.249: W/System.err(784): at com.project.new.datasettings.UpdateActivity$NetworkTask.onPostExecute(UpdateActivity.java:399)
08-14 13:45:16.249: W/System.err(784): at com.project.new.datasettings.UpdateActivity$NetworkTask.onPostExecute(UpdateActivity.java:1)
08-14 13:45:16.249: W/System.err(784): at android.os.AsyncTask.finish(AsyncTask.java:631)
08-14 13:45:16.249: W/System.err(784): at android.os.AsyncTask.access$600(AsyncTask.java:177)
08-14 13:45:16.249: W/System.err(784): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
08-14 13:45:16.249: W/System.err(784): at android.os.Handler.dispatchMessage(Handler.java:99)
08-14 13:45:16.249: W/System.err(784): at android.os.Looper.loop(Looper.java:137)
08-14 13:45:16.249: W/System.err(784): at android.app.ActivityThread.main(ActivityThread.java:5041)
08-14 13:45:16.249: W/System.err(784): at java.lang.reflect.Method.invokeNative(Native Method)
08-14 13:45:16.262: W/System.err(784): at java.lang.reflect.Method.invoke(Method.java:511)
08-14 13:45:16.262: W/System.err(784): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-14 13:45:16.262: W/System.err(784): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-14 13:45:16.269: W/System.err(784): at dalvik.system.NativeStart.main(Native Method)
08-14 13:45:16.319: D/MDN(784): 310260
08-14 13:45:16.319: D/mdn1(784): 526
08-14 13:45:16.329: D/mdn2(784): 251
08-14 13:45:16.339: D/ICCID(784): 89014103211118510720
08-14 13:45:16.339: I/System.out(784): ICCID%1234 = 464
08-14 13:45:16.339: I/System.out(784): ICCID/1234 = 72134605519544984
08-14 13:45:16.339: V/In the parser(784): now
08-14 13:45:16.349: W/System.err(784): org.xml.sax.SAXException: No input specified.
08-14 13:45:16.359: W/System.err(784): at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:288)
08-14 13:45:16.359: W/System.err(784): at com.project.new.datasettings.XmlParserHandlerFinal.getQueryResponse(XmlParserHandlerFinal.java:169)
08-14 13:45:16.359: W/System.err(784): at com.project.new.datasettings.ConfigFinalActivity.onCreate(ConfigFinalActivity.java:214)
08-14 13:45:16.359: W/System.err(784): at android.app.Activity.performCreate(Activity.java:5104)
08-14 13:45:16.359: W/System.err(784): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
08-14 13:45:16.359: W/System.err(784): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
08-14 13:45:16.359: W/System.err(784): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
08-14 13:45:16.369: W/System.err(784): at android.app.ActivityThread.access$600(ActivityThread.java:141)
08-14 13:45:16.379: W/System.err(784): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
08-14 13:45:16.379: W/System.err(784): at android.os.Handler.dispatchMessage(Handler.java:99)
08-14 13:45:16.379: W/System.err(784): at android.os.Looper.loop(Looper.java:137)
08-14 13:45:16.379: W/System.err(784): at android.app.ActivityThread.main(ActivityThread.java:5041)
08-14 13:45:16.379: W/System.err(784): at java.lang.reflect.Method.invokeNative(Native Method)
08-14 13:45:16.379: W/System.err(784): at java.lang.reflect.Method.invoke(Method.java:511)
08-14 13:45:16.379: W/System.err(784): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-14 13:45:16.391: W/System.err(784): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-14 13:45:16.399: W/System.err(784): at dalvik.system.NativeStart.main(Native Method)
08-14 13:45:27.959: D/dalvikvm(784): GC_CONCURRENT freed 352K, 36% free 4720K/7304K, paused 7ms+5ms, total 51ms
08-14 13:45:27.959: D/dalvikvm(784): WAIT_FOR_CONCURRENT_GC blocked 30ms
08-14 13:45:28.029: D/dalvikvm(784): GC_FOR_ALLOC freed 409K, 33% free 4932K/7304K, paused 28ms, total 28ms
08-14 13:45:28.299: D/dalvikvm(784): GC_CONCURRENT freed 625K, 31% free 5111K/7304K, paused 76ms+101ms, total 229ms
08-14 13:45:28.309: I/Choreographer(784): Skipped 38 frames! The application may be doing too much work on its main thread.
08-14 13:45:29.879: I/System.out(784): DEBUG THIS
08-14 13:45:29.879: D/AndroidRuntime(784): Shutting down VM
08-14 13:45:29.879: W/dalvikvm(784): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
08-14 13:45:29.940: E/AndroidRuntime(784): FATAL EXCEPTION: main
08-14 13:45:29.940: E/AndroidRuntime(784): java.lang.NullPointerException
08-14 13:45:29.940: E/AndroidRuntime(784): at com.project.new.datasettings.ConfigFinalActivity.showNotification(ConfigFinalActivity.java:533)
08-14 13:45:29.940: E/AndroidRuntime(784): at com.project.new.datasettings.ConfigFinalActivity.onClick(ConfigFinalActivity.java:644)
08-14 13:45:29.940: E/AndroidRuntime(784): at android.view.View.performClick(View.java:4204)
08-14 13:45:29.940: E/AndroidRuntime(784): at android.view.View$PerformClick.run(View.java:17355)
08-14 13:45:29.940: E/AndroidRuntime(784): at android.os.Handler.handleCallback(Handler.java:725)
08-14 13:45:29.940: E/AndroidRuntime(784): at android.os.Handler.dispatchMessage(Handler.java:92)
08-14 13:45:29.940: E/AndroidRuntime(784): at android.os.Looper.loop(Looper.java:137)
08-14 13:45:29.940: E/AndroidRuntime(784): at android.app.ActivityThread.main(ActivityThread.java:5041)
08-14 13:45:29.940: E/AndroidRuntime(784): at java.lang.reflect.Method.invokeNative(Native Method)
08-14 13:45:29.940: E/AndroidRuntime(784): at java.lang.reflect.Method.invoke(Method.java:511)
08-14 13:45:29.940: E/AndroidRuntime(784): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-14 13:45:29.940: E/AndroidRuntime(784): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-14 13:45:29.940: E/AndroidRuntime(784): at dalvik.system.NativeStart.main(Native Method)
08-14 13:45:33.651: I/Process(784): Sending signal. PID: 784 SIG: 9
资源:
public class UpdateActivity extends Activity implements OnClickListener {
public static ArrayList<String> NameArr = new ArrayList<String>();
public static ArrayList<String> ValueArr = new ArrayList<String>();
public static ArrayList<String> nameArr = new ArrayList<String>();
public static ArrayList<String> ApnArr = new ArrayList<String>();
public static ArrayList<String> mmscArr = new ArrayList<String>();
public static ArrayList<String> mmsportArr = new ArrayList<String>();
public static ArrayList<String> mmsproxyArr = new ArrayList<String>();
public static ArrayList<String> portArr = new ArrayList<String>();
public static ArrayList<String> proxyArr = new ArrayList<String>();
public static int count;
AlertDialog mErrorAlert = null;
int version;
public static int TotalSteps = 8;
private TelephonyManager tm;
private static final String LOG_TAG = "STDataSettings";
private Button mUpdateButton = null;
private Button mAssistUpdateButton = null;
private Button mAssistInstrButton = null;
private TextView mReadAgainButton = null;
private int mInstructionNumber = 0;
AlertDialog mConfirmAlert = null;
public static InputStream stream = null;
public static XmlParserHandlerFinal handler;
private NetworkTask task;
private AnimationDrawable loadingAnimation;
private static final String TAG = "UpdateActivity";
Context ctx;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// instance for xml parser class
handler = new XmlParserHandlerFinal();
handler.setContext(this.getBaseContext());
tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
int networkType = tm.getNetworkType();
int phoneType = tm.getPhoneType();
version = android.os.Build.VERSION.SDK_INT;
// to get MDN(MCC+MNC) of the provider of the SIM and ICCID (Serial
// number of the SIM)
// and to check for the Carrier type
task = new NetworkTask();
if (phoneType == TelephonyManager.PHONE_TYPE_CDMA
|| (phoneType != TelephonyManager.PHONE_TYPE_GSM
&& networkType != TelephonyManager.NETWORK_TYPE_GPRS
&& networkType != TelephonyManager.NETWORK_TYPE_EDGE
&& networkType != TelephonyManager.NETWORK_TYPE_HSDPA
&& networkType != TelephonyManager.NETWORK_TYPE_HSPA
&& networkType != TelephonyManager.NETWORK_TYPE_HSPAP
&& networkType != TelephonyManager.NETWORK_TYPE_HSUPA
&& networkType != TelephonyManager.NETWORK_TYPE_UMTS && networkType != TelephonyManager.NETWORK_TYPE_LTE)) {
// If the phone type is CDMA or
// the phone phone type is not GSM and the network type is none of
// the network types indicated in the statement
// Display incompatibility message
showAlert(getString(R.string.incomp_sm_dialog));
// Network type is looked because some tablets have no phone type.
// We rely on network type in such cases
} else if (!(tm.getSimState() == TelephonyManager.SIM_STATE_ABSENT
|| (tm.getSimOperator())
.equals(getString(R.string.numeric_tmo)) || (tm
.getSimOperator()).equals(getString(R.string.numeric_att)))) {
// if SIM is present and is NOT a T-Mo network SIM,
// display Error message alert indicating to use SM SIM
showAlert(getString(R.string.insert_sm_dialog));
}// No SIM or SIM with T-Mo MNC MCC present
else if (version < VERSION_CODES.ICE_CREAM_SANDWICH) {
// Initial UI setup for versions lower than ICS
setContentView(R.layout.update);
mUpdateButton = (Button) findViewById(R.id.update_button);
mUpdateButton.setOnClickListener(this);
} else {// ICS and up
// task.execute();
if ((tm.getSimOperator()).equals(getString(R.string.numeric_tmo))
|| (tm.getSimOperator())
.equals(getString(R.string.numeric_att))) {
// Update APN table in separate thread
task.execute("");
// Device has T-Mo network SIM card MCC and MNC correctly
// populated
// Reduce number of steps to 6
TotalSteps = 6;
}
}
}
public void onClick(View v) {
if (v == mUpdateButton) {
// Update button for versions lower than ICS is selected
// setContentView(R.layout.updating);
onClickMethod(v);
Intent i = new Intent(this, ConfigFinalActivity.class);
startActivity(i);
finish();
} else if (v == mAssistUpdateButton) {
// Update button for ICS and up is selected
// Get the TextView in the Assist Update UI
TextView tv = (TextView) findViewById(R.id.apn_app_text_cta2);
String text = "";
CharSequence styledText = text;
switch (mInstructionNumber) {
case 0:
// Retrieve the instruction string resource corresponding the
// 2nd set of instructions
text = String.format(getString(R.string.apn_app_text_instr),
TotalSteps);
styledText = Html.fromHtml(text);
// Update the TextView with the correct set of instructions
tv.setText(styledText);
// Increment instruction number so the correct instructions
// string resource can be retrieve the next time the update
// button is pressed
mInstructionNumber++;
break;
case 1:
text = getString(R.string.apn_app_text_instr2);
styledText = Html.fromHtml(text);
tv.setText(styledText);
// Increment instruction number so the correct instructions
// string resource can be retrieve the next time the update
// button is pressed
mInstructionNumber++;
break;
case 2:
// Final set of instructions-Change to the corresponding layout
setContentView(R.layout.assist_instructions);
String assistUpdateInstr = String.format(
getString(R.string.apn_app_text_instr3), TotalSteps);
styledText = Html.fromHtml(assistUpdateInstr);
TextView assistInstrText = (TextView) findViewById(R.id.updated_text);
assistInstrText.setText(styledText);
mAssistInstrButton = (Button) findViewById(R.id.assist_instr_btn);
mReadAgainButton = (TextView) findViewById(R.id.read_again_btn);
mAssistInstrButton.setOnClickListener(this);
mReadAgainButton.setOnClickListener(this);
}
} else if (v == mAssistInstrButton) {
// "LET'S DO THIS" Button in final instructions screen for ICS and
// up is selected
// Create ConfigActivity Intent
Intent i = new Intent(this, ConfigFinalActivity.class);
// Invoke ConfigActivity Intent to start the assisted update
startActivity(i);
finish();
} else if (v == mReadAgainButton) {
// go back to 1st set of instructions if read again is selected
mInstructionNumber = 0;
setContentView(R.layout.assist_update);
String assistUpdate = getString(R.string.apn_app_text_cta2);
CharSequence styledText = Html.fromHtml(assistUpdate);
TextView assistText = (TextView) findViewById(R.id.apn_app_text_cta2);
assistText.setText(styledText);
mAssistUpdateButton = (Button) findViewById(R.id.assist_update_btn);
mAssistUpdateButton.setOnClickListener(this);
}
}
public void onClickMethod(View v) {
mUpdateButton = (Button) findViewById(R.drawable.btn_update_active_hdpi);
}
private void showAlert(String message) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(message).setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
UpdateActivity.this.finish();
}
});
mConfirmAlert = builder.create();
mConfirmAlert.show();
}
// AsyncTask to call web service
class NetworkTask extends AsyncTask<String, Integer, InputStream> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected InputStream doInBackground(String... params) {
try {
// saving the response in InputStream
stream = getQueryResults("https://dl.dropboxusercontent.com/u/31771876/GetPhoneSettings-ST-rsp-eng.xml");
// stream = new BufferedInputStream(https.getInputStream());
DataInputStream in = new DataInputStream(stream);
BufferedReader br = new BufferedReader(
new InputStreamReader(in));
String strLine;
while ((strLine = br.readLine()) != null) { // Print the content
// on the console
System.out.println(strLine);
in.close();
}
} catch (IOException e) {
Log.v(LOG_TAG, e.toString());
e.printStackTrace();
} catch (SAXException e) {
Log.v(LOG_TAG, e.toString());
e.printStackTrace();
} catch (Exception e) {
Log.v(LOG_TAG, e.toString());
e.printStackTrace();
}
// The code below plays a Simple Promo animation
for (int incr = 0; incr < 2; incr++) {
// Sleep for 1/2 second
// Invoke UI to change updating text to show 1 dot
// And Increasing the level to reduce the amount of clipping and
// slowly reveals the hand image
publishProgress(R.drawable.loading_full,
R.drawable.loading_empty, R.drawable.loading_empty,
R.drawable.loading_empty, R.drawable.loading_empty);
try {
// Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
Log.d(TAG, "sleep failure");
}
publishProgress(R.drawable.loading_full,
R.drawable.loading_full, R.drawable.loading_empty,
R.drawable.loading_empty, R.drawable.loading_empty);
try {
// Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
Log.d(TAG, "sleep failure");
}
publishProgress(R.drawable.loading_full,
R.drawable.loading_full, R.drawable.loading_full,
R.drawable.loading_empty, R.drawable.loading_empty);
try {
// Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
Log.d(TAG, "sleep failure");
}
publishProgress(R.drawable.loading_full,
R.drawable.loading_full, R.drawable.loading_full,
R.drawable.loading_full, R.drawable.loading_empty);
try {
// Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
Log.d(TAG, "sleep failure");
}
publishProgress(R.drawable.loading_full,
R.drawable.loading_full, R.drawable.loading_full,
R.drawable.loading_full, R.drawable.loading_full);
// Sleep for 1/2 second
try {
// Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
Log.d(TAG, "sleep failure");
}
}
return stream;
}
/*
* Sends a query to server and gets back the parsed results in a bundle
* urlQueryString - URL for calling the webservice
*/
protected synchronized InputStream getQueryResults(String urlQueryString)
throws IOException, SAXException, SSLException,
SocketTimeoutException, Exception {
// HttpsURLConnection https = null;
HttpsURLConnection https = null;
String uri = urlQueryString;
URL urlo = new URL(uri);
try {
https = (HttpsURLConnection) urlo.openConnection();
https.setConnectTimeout(20000); // 20 second timeout
https.setRequestProperty("Connection", "Keep-Alive");
if ("gzip".equals(https.getContentEncoding())) {
stream = new GZIPInputStream(stream);
} else
stream = https.getInputStream();
} catch (SSLException e) {
Log.e(LOG_TAG, e.toString());
e.printStackTrace();
} catch (SocketTimeoutException e) {
Log.e(LOG_TAG, e.toString());
e.printStackTrace();
} catch (IOException e) {
Log.e(LOG_TAG, e.toString());
e.printStackTrace();
} catch (Exception e) {
Log.e(LOG_TAG, e.toString());
e.printStackTrace();
} finally {
// https.disconnect();
}
return stream;
}
@Override
protected void onProgressUpdate(Integer... progress) {
// Call function to update image view
setProgressImgView(progress[0], progress[1]);
}
@Override
protected void onPostExecute(InputStream stream) {
super.onPostExecute(stream);
// This method is called to parse the response and save the
// ArrayLists
success();
}
}
private void setProgressImgView(Integer textViewId, Integer imageViewId) {
// update image view with the updating dots
// Reset view layout in case orientation while updating
// setContentView(R.layout.updating);
}
@Override
protected void onRestart() {
super.onRestart();
if (mErrorAlert != null)
mErrorAlert.dismiss();
}
public void success() {
// to parse the response
try {
handler.getQueryResponse(stream);
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// to set method to save the ArryaLists from the parser
setArrayList();
Intent i = new Intent(this, ConfigFinalActivity.class);
startActivity(i);
finish();
}
// method to save the ArrayLists from parser
public static void setArrayList() {
nameArr = handler.getnameArr();
ApnArr = handler.getApnArr();
mmscArr = handler.getMMSCArr();
mmsproxyArr = handler.getMmscProxyArr();
mmsportArr = handler.getMmsPortArr();
proxyArr = handler.getMmscProxyArr();
portArr = handler.getMmsPortArr();
count = handler.getCount();
// System.out.println("testing123");
for (int i = 0; i < nameArr.size() - 1; i++) {
System.out.println(nameArr.get(i));
}
for (int i = 0; i < ApnArr.size() - 1; i++) {
System.out.println(ApnArr.get(i));
}
}
}