私のAndroidアプリでは、ユーザーがWebサイトからデータをフェッチできるようにしたい(httpリクエストを送信して)。http 応答は、データを表示する別のアクティビティに送信されます。(このコード例ではこれを少し単純化しました。実際には、データはオブジェクトに解析され、オブジェクトが送信されます)。
これはすべて私のコードでうまく機能します。しかし、ユーザーが戻るキーを押してメイン アクティビティに戻り、別の要求を試みると、アプリケーションjava.io.FileNotFoundException
は URLConnection から入力ストリームを取得しているときにエラーをスローします。アプリを閉じて(もう一度押して)再度開くと、すべて正常に機能します。
接続が適切に閉じられていないなどの問題があると確信していますが、コードでエラーを見つけることができません。ここで何が問題なのですか?
MainActivity.java
*no interessting code here.
it just calls the static function from MainMethods.java
when a button is pressed*
MainFunctions.java - 複数のクラスからメソッドを呼び出したいので、追加のクラスにします
class MainFunctions {
public static void search(final Activity, final String searchString) {
new AsyncTast<String, String, String>() {
protected void onPreExecute() {
// im opening a progress dialog for the activity here
}
protected String doInBackground(String... searchString) {
try{
return new HttpUtils().sendRequest(searchString)
} catch (Exception e) {
// print a dialog, stacktrace and stuff
return null;
}
}
protected void onPostExecute(String result) {
if(result != null) {
// dismiss the dialog etc..
Intent i = new Intent("packagename");
i.putExtra("key", result);
activity.startActivity(i);
}
}
}.start(searchString)
}
}
HttpUtils.java
public class HTTPUtils {
public String sendRequest(String data)
throws IOException {
String answer = "";
URL url = new URL("http://myURL.com/" + data);
URLConnection conn = url.openConnection();
conn.setReadTimeout(5000);
BufferedReader in = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
answer += inputLine;
in.close();
return answer;
}
}
Stacktrace は、conn.getInputStream()
が呼び出されている間に例外がスローされることを示しています。
java.io.FileNotFoundException: http://myURL.com/danijoo
at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java)
at com.elophant.utils.HTTPUtils.sendRequest(HTTPUtils.java:20)
at com.elophant.Elophant.getSummoner(Elophant.java:183)
at com.lolsummoners.datacollector.Collecter.getSummonerInfo(Collecter.java:39)
at com.lolsummoners.utils.MainFunctions$1.doInBackground(MainFunctions.java:106)
at com.lolsummoners.utils.MainFunctions$1.doInBackground(MainFunctions.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java)
at java.util.concurrent.FutureTask.run(FutureTask.java)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java)
at java.lang.Thread.run(Thread.java)
メソッドgetSummoner()
とgetSummonerInfo()
メソッドは、応答文字列からオブジェクトを解析するメソッドです。問題を理解しやすくするために、それを公開しました。
ありがとう!