0

AndroidHttpClientCSVファイルのダウンロードに使用しようとしています。何らかの理由でそれは行で失敗し、"HttpResponse response httpClient.execute(httpGet, localContext);単にに行き"finally"ます。

ブラウザでURLを確認しました-正常に動作しています。

HttpResponse応答から情報を取得しません-それは単にそれをスキップするようなものです。

理由がわかりません。何か案は?

ありがとう

private ArrayList<String> retrieveStockFinParamsFromYahooApiUri(String yahooApiCall)
    {
        ArrayList<String> stockFinParamsFromYahooApiUriRows = new ArrayList<String>();
        String resultLine = "";

        BufferedReader reader = null;
        AndroidHttpClient httpClient = AndroidHttpClient.newInstance("yahooGetStockParams");
        HttpContext localContext = new BasicHttpContext();
        HttpGet httpGet = new HttpGet(yahooApiCall);

        try 
        {
            HttpResponse response = httpClient.execute(httpGet, localContext);              

            reader = new BufferedReader(new InputStreamReader(
                    response.getEntity().getContent()));

            while ((resultLine = reader.readLine()) != null) 
            {
                stockFinParamsFromYahooApiUriRows.add(resultLine);
            }
        }
        catch (IOException e) 
        {
            e.printStackTrace();
        } 
        finally 
        {
            if (reader != null) 
            {
                try 
                {
                    reader.close();
                } 
                catch (IOException e) 
                {
                    e.printStackTrace();
                }
            }
        }

        return stockFinParamsFromYahooApiUriRows;
    }

さらなる調査(2012年5月22日):

@Snicolas-コメントありがとうございます。あなたのコメントを読んだ後、問題は私がこれをデバッグするために実際のデバイスではなくエミュレーターを使用したという事実に起因するのではないかと思いました。エミュレーターに接続の問題が発生する可能性があると思いました。デバイスでテストしたところ、問題がまだ発生していることに気づきました。したがって、これは問題ではありませんでした。

catch (Throwable e)だから私はあなたがアドバイスしたように私のコードを変更し、次のスタックスナップショットを取得しました:

05-22 18:17:41.457: W/System.err(24552): android.os.NetworkOnMainThreadException
05-22 18:17:41.461: W/System.err(24552):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
05-22 18:17:41.461: W/System.err(24552):    at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
05-22 18:17:41.461: W/System.err(24552):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
05-22 18:17:41.465: W/System.err(24552):    at java.net.InetAddress.getAllByName(InetAddress.java:220)
05-22 18:17:41.465: W/System.err(24552):    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
05-22 18:17:41.465: W/System.err(24552):    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
05-22 18:17:41.468: W/System.err(24552):    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
05-22 18:17:41.468: W/System.err(24552):    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
05-22 18:17:41.468: W/System.err(24552):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
05-22 18:17:41.472: W/System.err(24552):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
05-22 18:17:41.472: W/System.err(24552):    at android.net.http.AndroidHttpClient.execute(AndroidHttpClient.java:257)
05-22 18:17:41.472: W/System.err(24552):    at com.bewildering.app.StournamentDbAdapter$YahooStocksParams.retrieveStockFinParamsFromYahooApiUri(StournamentDbAdapter.java:1536)
05-22 18:17:41.476: W/System.err(24552):    at com.bewildering.app.StournamentDbAdapter$YahooStocksParams.run(StournamentDbAdapter.java:1709)
05-22 18:17:41.476: W/System.err(24552):    at com.bewildering.app.StournamentActivity.onCreate(StournamentActivity.java:65)
05-22 18:17:41.476: W/System.err(24552):    at android.app.Activity.performCreate(Activity.java:4465)
05-22 18:17:41.476: W/System.err(24552):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
05-22 18:17:41.480: W/System.err(24552):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
05-22 18:17:41.480: W/System.err(24552):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
05-22 18:17:41.480: W/System.err(24552):    at android.app.ActivityThread.access$600(ActivityThread.java:123)
05-22 18:17:41.484: W/System.err(24552):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
05-22 18:17:41.484: W/System.err(24552):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-22 18:17:41.484: W/System.err(24552):    at android.os.Looper.loop(Looper.java:137)
05-22 18:17:41.484: W/System.err(24552):    at android.app.ActivityThread.main(ActivityThread.java:4424)
05-22 18:17:41.488: W/System.err(24552):    at java.lang.reflect.Method.invokeNative(Native Method)
05-22 18:17:41.488: W/System.err(24552):    at java.lang.reflect.Method.invoke(Method.java:511)
05-22 18:17:41.488: W/System.err(24552):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-22 18:17:41.492: W/System.err(24552):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-22 18:17:41.492: W/System.err(24552):    at dalvik.system.NativeStart.main(Native Method)

探しているときに、これが次のように記載されているドキュメントandroid.os.NetworkOnMainThreadExceptionを見つけました。アプリケーションがメインスレッドでネットワーク操作を実行しようとしたときにスローされる例外。

それから、私は自分の呼び出しをに入れるべきであると結論付けAsyncTaskます。

誰かが私がこれを正しく理解していることを確認できますか?それとも私はここで何かが欠けていますか?catch (Throwable e)これの底に到達するために私が嫌うのは奇妙です。


さらなる調査(2012年5月22日):

この問題は、アプリケーションがメインスレッドでネットワーク操作を実行しようとすると例外...がスローされるために発生することを確認できます。私が読んだように、これはハニカムから始まりました。

今の問題:Yahoo(Moved Permanently)から301の応答があります。URLをブラウザにカットペーストすると機能するため、これは奇妙なことです。

これがブラウザでは機能するが、アプリケーションでは機能しない理由はありますか?このHTTPリクエストはCSVファイルをレスポンスとして受け取ることに注意する必要があります。これは問題になる可能性がありますか?


さらなる調査(2012年5月23日):

何らかの理由で(私のコードで)Yahoo URI http://finance.yahoo.com/d/quotes.csv?s=を使用すると、応答は301(永続的に移動)になります。代わりにhttp://download.finance.yahoo.com/d/quotes.csv?s=を使用すると、応答は200(OK)になります。それでも、ブラウザではどちらも正常に機能します。幸運にも、YahooがどのURIに反応するかについての手がかりを与えてくれるこのWebページを見つけることができました。これで、「リーダー」がデータを取得し、すべてがほぼ正常であることがわかります。私はまだいくつかの奇妙な例外を受け取ります(まだそれを理解しようとしています):応答のすべての行を読んだ後、Throwableをキャッチし(以前の実験からそれを残しました)、後でスタックで取得05-23 08:52:41.258: W/dalvikvm(933): threadid=11: thread exiting with uncaught exception (group=0x40a721f8)し、キャッチされていないものについて何かを取得しますの例外doInBackground(Void... params)。まだ調査中です...

この問題を解決したばかりです。YahooAPIを呼び出すのは間違いでした。URIを機能させるには、URIの末尾に&e=.csvを追加する必要がありました。ちょうどそのように:http ://download.finance.yahoo.com/d/quotes.csv?s = KDHIX&f = sl1d1t1c1ohgv&e = .csv


最終コード

private ArrayList<String> retrieveStockFinParamsFromYahooApiUri(String yahooApiCall)
    {
        ArrayList<String> stockFinParamsFromYahooApiUriRows = new ArrayList<String>();
        String resultLine = "";

        BufferedReader reader = null;
        AndroidHttpClient httpClient = AndroidHttpClient.newInstance("yahooGetStockParams");
        HttpContext localContext = new BasicHttpContext();
        HttpGet httpGet = new HttpGet(yahooApiCall);

        try 
        {
            HttpResponse response = httpClient.execute(httpGet, localContext);                  

            reader = new BufferedReader(new InputStreamReader(
                    response.getEntity().getContent()));

            while ((resultLine = reader.readLine()) != null) 
            {
                stockFinParamsFromYahooApiUriRows.add(resultLine);
            }

            if(response != null)
            {
                try
                {
                    response.getEntity().consumeContent();
                }
                catch (IOException e) 
                {
                    e.printStackTrace();
                }

            }
        }
        catch (IOException e) 
        {
            e.printStackTrace();                
        } 
        finally 
        {               
            if(httpClient != null)
            {
                httpClient.close();
            }

            if (reader != null) 
            {
                try 
                {
                    reader.close();
                } 
                catch (IOException e) 
                {
                    e.printStackTrace();
                }
            }
        }

        return stockFinParamsFromYahooApiUriRows;
    }
4

1 に答える 1

1

Exceptionではない in execute を取得する可能性がありIOExceptionます。次に、ブロックが実行されることはなく、メソッドが の呼び出し元に予期される例外をスローする前にブロックが実行されcatchます。finallyretrieveStockFinParamsFromYahooApiUri

少なくとも 2 つのオプションがあります。

  • キャッチするのではIOExceptionなく、プレント クラスをキャッチします。を試してThrowable、スタック トレースを出力し、何が起こるかを確認してください。その後、後で他の catch ブロックを追加して、ケースを処理できます。(キャッチThrowablesは悪いプログラミング手法ですが、一時的に使用できます)。
  • の呼び出しをretrieveStockFinParamsFromYahooApiUri上記と同じメカニズムを使用して try catch ブロックに配置し、どの例外クラスが予期され、それに応じて動作するかを決定します。

ただし、問題の理解を深め、可能な限りすべてをキャッチし、スタック トレースを書き、logcat を確認する必要があります。

その他のアドバイスは次のとおりです。

于 2012-05-21T21:21:03.810 に答える