【问题标题】:How to connect Android with HTTPsURLConnection如何使用 HTTPsURLConnection 连接 Android
【发布时间】:2016-01-05 08:51:09
【问题描述】:

我一直在尝试找出代码很长一段时间,但是没有成功。每次应用程序通过抛出一些随机异常而崩溃。

我从 youtube 上的教程中学习了这段代码,尽管如此,该代码对我不起作用。

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import org.w3c.dom.Text;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.Buffer;

import javax.net.ssl.HttpsURLConnection;

public class MainActivity extends AppCompatActivity {
Button b1;
TextView t1;
private Context context;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    b1=(Button)findViewById(R.id.bthhit);
    t1=(TextView)findViewById(R.id.tvJSONitem);

    b1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            new JSONTask().execute("http://jsonparsing.parseapp.com/jsonData/moviesDemoItem.txt");
        }
    });

}

public class JSONTask extends AsyncTask<String,String,String>{
    HttpsURLConnection connection = null;
    BufferedReader reader = null;

    @Override
    protected String doInBackground(String... params) {

        try {
            URL url=new URL(params[0]);
            connection= (HttpsURLConnection)url.openConnection();
            connection.connect();

            InputStream stream= connection.getInputStream();

            reader = new BufferedReader(new InputStreamReader(stream));
            String line;
            StringBuffer buffer= new StringBuffer();
            while((line=reader.readLine())!=null){
                buffer.append(line);
            }

            return buffer.toString();

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

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        t1.setText(result);

    }
}
}

Logcat 显示:

01-05 00:46:09.018 5573-5580/? E/art: Failed sending reply to debugger: Broken pipe
01-05 00:46:17.852 5573-5706/com.example.test.jsonparser E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
   Process: com.example.test.jsonparser, PID: 5573
   java.lang.RuntimeException: An error occurred while executing doInBackground()
       at android.os.AsyncTask$3.done(AsyncTask.java:309)
       at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
       at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
       at java.util.concurrent.FutureTask.run(FutureTask.java:242)
       at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
       at java.lang.Thread.run(Thread.java:818)
    Caused by: java.lang.ClassCastException: com.android.okhttp.internal.huc.HttpURLConnectionImpl cannot be cast to javax.net.ssl.HttpsURLConnection
       at com.example.test.jsonparser.MainActivity$JSONTask.doInBackground(MainActivity.java:58)
       at com.example.test.jsonparser.MainActivity$JSONTask.doInBackground(MainActivity.java:49)
       at android.os.AsyncTask$2.call(AsyncTask.java:295)
       at java.util.concurrent.FutureTask.run(FutureTask.java:237)
       at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
       at java.lang.Thread.run(Thread.java:818) 
01-05 00:46:19.104 5573-5587/com.example.test.jsonparser E/Surface: getSlotFromBufferLocked: unknown buffer: 0xab792110

【问题讨论】:

    标签: json http exception httpurlconnection


    【解决方案1】:

    请注意,您的 URL 协议是 HTTP 而不是 HTTPS。尝试使用 java.net.HttpURLConnection 对象或 "https://..." URL。

    【讨论】:

    • 非常感谢!不要相信我错过了这么愚蠢的事情!很大的帮助
    • 我已将 java.net.HttpURLConnection 用于不安全的 URL,但 Google 在 Play 商店发布应用程序期间不会接受 HttpURLConnection 实现。 Play 商店的警报消息 - “您的应用程序正在使用 HostnameVerifier 接口的不安全实现。”。请提供任何解决方案?
    【解决方案2】:

    如果您的应用程序不需要像.getResponseCode() 或...这样的特定方法,那么您也可以使用通用的URLConnection 类,它不会引入这种异常,因为它是HttpURLConnection 和 Https... 类的父类。

    【讨论】:

      猜你喜欢
      • 2011-10-30
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 2011-01-11
      相关资源
      最近更新 更多