2

我怀疑我在简单的 Android 应用程序中遇到了一些线程问题。

我有一个 Activity 执行以下操作:

  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

首先确保您添加了 Internet 权限到清单:

<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

我有完全相同的问题让我疯狂地解决。我已经设置了 timout 参数,但是 httpurlconnection 挂在 connect() 调用上,或者如果我没有显式调用 connect(),则稍后挂起 getInputStream()。

使用原始线程而不是 asynctask 对我有用,而无需更改任何其他内容...

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

解决方法多于解决方案,但总比没有好。

于 2019-09-19T16:43:42.610 回答
-1

删除这两行:

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 回答