2

単純なAndroidアプリのスレッド化に起因するいくつかの問題が発生しているのではないかと思います。

次のようなアクティビティがあります。

  1. メインスレッドでダイアログを実行します
  2. バックグラウンドスレッドを回転させ、この接続を使用してデータを取得するためのPHPスクリプトをヒットし、DefaultHttpClientこの接続を閉じます。これにより、インターネット上の画像へのURLが正常に返されます
  3. HttpUrlConnection呼び出されたものを開きconn、conn.connectを試してください
  4. この時点でアプリはエラーなしでフリーズします

ここに配置するコードがわからない場合は、すべて貼り付けることができますが、それでは多すぎるので、さらに情報が必要な場合はお知らせください。

/**
 * Background Async Task to Load all Question by making HTTP Request
 */
class LoadAllImages extends AsyncTask<String, String, String> {
  /**
   * Before starting background thread Show Progress Dialog
   * */
  @Override
  protected void onPreExecute() {
    super.onPreExecute();
    // dialog init'd here
  }

  @Override
  protected String doInBackground(String... args) {
    // Building Parameters
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    // getting JSON string from URL
    JSONObject json = jParser.makeHttpRequest(url_question_details, "GET", params);



    // Check your log cat for JSON response
    Log.d("All Questions: ", json.toString());

    try {

        // images found
        // Getting Array of questions
        images = json.getJSONArray(TAG_IMAGES);

        // looping through All questions
        for (int i = 0; i < images.length(); i++) {
          JSONObject c = images.getJSONObject(i);

          // Storing each json item in variable
          String id = c.getString(TAG_IMAGEID);
          String location = c.getString(TAG_IMAGELOCATION);

          URL myFileUrl = null;
          try {
            myFileUrl = new URL(location);
          } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
          try {
            HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
            conn.setDoInput(true);
            conn.connect(); // freezes here
            int length = conn.getContentLength();
            int[] bitmapData = new int[length];
            byte[] bitmapData2 = new byte[length];
            InputStream is = conn.getInputStream();
          } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
4

4 に答える 4

4

まず、マニフェストにインターネット許可を追加したことを確認してください。

<uses-permission android:name="android.permission.INTERNET" /> 

AndroidManifest.xmlのアプリケーションタグの外側


トラブルシューティング:

  1. ブラウザを使用して同じURLにアクセスしてみてください
  2. プロキシの背後にいないか、サーバーがプロキシの背後にないかを確認してください
  3. サーバーにpingを実行して、遅延を確認して確認してください。
  4. すべての例外をキャッチしてみてください。

} catch (IOException e) {に変更} catch (Exception e) {


すべてが良さそうな場合は、次のコードを試してください。

System.setProperty("http.keepAlive", "false");
HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
conn.setUseCaches(false); 
conn.setConnectTimeout(30000);
conn.setDoOutput(true); 
conn.setDoInput(true); 

//conn.connect(); // You are allready connected after openConnection().

それでもうまくいかない場合は、次のように使用してみてHttpClientくださいHttpGet

final HttpClient client = new DefaultHttpClient();
final HttpGet conn = new HttpGet(myFileUrl.toString());

HttpResponse response = client.execute(conn);
InputStream is = response.getEntity().getContent();
于 2012-10-18T16:34:05.887 に答える
1

少なくとも接続タイムアウトと読み取りタイムアウトの両方を入れます。

      conn.setConnectTimeout(5000);
      conn.setReadTimeout(5000);
于 2018-02-16T11:35:32.507 に答える
0

私は、解決することに夢中になったのとまったく同じ問題を抱えていました。私はすでにtimoutparamsを設定していましたが、httpurlconnectionはconnect()呼び出しでハングしていました。または、明示的にconnect()を呼び出さない場合は、後でgetInputStream()でハングしていました。

asynctaskの代わりにrawスレッドを使用すると、他に何も変更せずに機能しました...

new Thread(() -> task.doInBackground())

解決策よりも回避策ですが、何もないよりはましです。

于 2019-09-19T16:43:42.610 に答える
-1

次の2行を削除します。

conn.setDoInput(true);
conn.connect(); // freezes here

これを行うとき:

HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
int length = conn.getContentLength();

すでに接続されています。呼び出しconn.getContentLength()によりHttpURLConnection接続が確立され、要求が送信され、応答がフェッチされます。明示的に接続する必要はありません。setDoInput(true)また、これがデフォルト設定であるため、呼び出す必要はありません。

于 2012-10-18T16:42:41.043 に答える