AsyncTask を使用して簡単な認証ページを試しています。doInBackground() メソッドで Web サービスへの接続を実行し、onPostExecute() メソッドで UI を更新しています。私の Web サービスは、送信されたユーザー名とパスワードを単純にチェックし、JSON オブジェクトを返します。Web サービスが稼働していて、JSON オブジェクトを返す限り、このコードは正常に機能します。しかし、サービスがダウンしていて接続に失敗すると、以下に添付したエラーが表示されます。
これが私のコードです:
private class AuthneticateTask extends AsyncTask<String, Void, JSONObject> {
public InputStream is = null;
public JSONObject jObj = null;
public String json = "";
public int flag = 0;
protected JSONObject doInBackground(String... urls) {
HttpClient client = new DefaultHttpClient();
String getURL = "http://MYWEBSERVICE";
HttpGet get = new HttpGet(getURL);
get.addHeader("authorization", urls[0]);
HttpResponse responseGet;
try {
responseGet = client.execute(get);
HttpEntity httpEntity = responseGet.getEntity();
is = httpEntity.getContent();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
System.out.println("Authentication status: "+sb.toString());
}
is.close();
json = sb.toString();
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
} catch (Exception e) {
// Log.e("Buffer Error", "Error converting result " + e.toString());
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
System.out.println("this is where connection errors are caught!");
jObj.put("authentication", "cfailed");
return jObj;
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return jObj;
}
protected void onPostExecute(JSONObject result) {
String auth;
String notes;
try {
auth = jObj.getString("authentication");
notes = jObj.getString("note");
if (auth.equalsIgnoreCase("cfailed"))
{
emessage.setTextColor(RED);
emessage.setText("Connection to server failed");
}
else
{
if (auth.equalsIgnoreCase("Successfull"))
{
// TODO login to page
}else if(auth.equalsIgnoreCase("unSuccessfull"))
{
emessage.setText(notes);
emessage.setTextColor(RED);
if(notes.contains("password"))
lpass.setTextColor(RED);
else if(notes.contains("name"))
luname.setTextColor(RED);
}
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ログキャット:
01-03 13:22:13.567: E/AndroidRuntime(334): FATAL EXCEPTION: AsyncTask #1
01-03 13:22:13.567: E/AndroidRuntime(334): java.lang.RuntimeException: An error occured while executing doInBackground()
01-03 13:22:13.567: E/AndroidRuntime(334): atandroid.os.AsyncTask$3.done(AsyncTask.java:200)
01-03 13:22:13.567: E/AndroidRuntime(334):at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
01-03 13:22:13.567: E/AndroidRuntime(334): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
01-03 13:22:13.567: E/AndroidRuntime(334):at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
01-03 13:22:13.567: E/AndroidRuntime(334):at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-03 13:22:13.567: E/AndroidRuntime(334): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
01-03 13:22:13.567: E/AndroidRuntime(334): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
01-03 13:22:13.567: E/AndroidRuntime(334): at java.lang.Thread.run(Thread.java:1096)
01-03 13:22:13.567: E/AndroidRuntime(334): Caused by: java.lang.NullPointerException
01-03 13:22:13.567: E/AndroidRuntime(334): at com.cyberink.asyncauth.login$AuthneticateTask.doInBackground(login.java:194)
01-03 13:22:13.567: E/AndroidRuntime(334): at com.cyberink.asyncauth.login$AuthneticateTask.doInBackground(login.java:1)
01-03 13:22:13.567: E/AndroidRuntime(334): at android.os.AsyncTask$2.call(AsyncTask.java:185)
01-03 13:22:13.567: E/AndroidRuntime(334): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-03 13:22:13.567: E/AndroidRuntime(334): ... 4 more