web-dev-qa-db-ja.com

接続方法Android with HTTPsURLConnection

私はかなり長い間コードを理解しようとしてきましたが、成功しませんでした。ランダムな例外をスローしてアプリがクラッシュするたび。

私は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
12
Addy

URLプロトコルは[〜#〜] http [〜#〜]であり、[〜#〜] https [〜#〜]ではないことに注意してください。 Java.net.HttpURLConnectionオブジェクトまたは "https:// ..."URLを使用してみてください。

22
J-Cint

.getResponseCode()や、...などの特定のメソッドがアプリで必要ない場合は、汎用のURLConnectionクラスも使用できます。これにより、この種の例外の導入は控えられます。どういうわけか、それはHttpURLConnectionクラスとHttps ...クラスの両方の親クラスだからです。

0
Reza Hamzehei