Java 在doInBackground中使用OkHttpClient时,应用程序崩溃

Java 在doInBackground中使用OkHttpClient时,应用程序崩溃,java,android,okhttp,Java,Android,Okhttp,我在Android棒棒糖上的应用程序运行良好,但在较低版本中,程序crashe显示此错误: 捕获异常 java.lang.RuntimeException:执行doInBackground()时出错 并指向这行代码: OkHttpClient client = new OkHttpClient(); 这是我的代码: private void getMoviesFromDBz(int id) { AsyncTask<Integer, Void, Void> asyncTas

我在Android棒棒糖上的应用程序运行良好,但在较低版本中,程序crashe显示此错误:

捕获异常 java.lang.RuntimeException:执行doInBackground()时出错

并指向这行代码:

OkHttpClient client = new OkHttpClient();
这是我的代码:

private void getMoviesFromDBz(int id) {

    AsyncTask<Integer, Void, Void> asyncTask = new AsyncTask<Integer, Void, Void>() {



        @Override
        protected void onPreExecute() {
            super.onPreExecute();

        }


        @Override
        protected Void doInBackground(Integer... movieIds) {

            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url(linkkk + movieIds[0])
                    .build();
            try {
                Response response = client.newCall(request).execute();

                JSONArray array = new JSONArray(response.body().string());

                for (int i = 0; i < array.length(); i++) {

                    JSONObject object = array.getJSONObject(i);

                    Movie movie = new Movie(object.getInt("id") , object.getString("per") , object.getString("movie_name"),
                            object.getString("movie_image"), object.getString("movie_genre") , object.getString("movie_discription") , object.getString("movie_lat"), object.getString("movie_lon") , object.getString("movie_marker") , object.getString("sort") , object.getString("price") , object.getString("email") , object.getString("tell") , object.getString("location") , object.getString("count"));


                    ItemOneFragment.this.movies2.add(movie);
                }


            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            adapter2.notifyDataSetChanged();
            getMoviesFromDB(0);
        }
    };

    asyncTask.execute(id);
    scroll2 = 1;
}
private void getMoviesFromDBz(int-id){
AsyncTask AsyncTask=新建AsyncTask(){
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的Void doInBackground(整数…电影ID){
OkHttpClient=新的OkHttpClient();
Request Request=newrequest.Builder()
.url(linkkk+movieIds[0])
.build();
试一试{
Response=client.newCall(request.execute();
JSONArray数组=新的JSONArray(response.body().string());
对于(int i=0;i
您试图在后台线程中访问主/UI线程:

ItemOneFragment.this.movies2.add(电影)


只需返回
movie
对象并在
onPostExecute()
方法上执行上述行,我也不建议为每个请求实例化
OkHttpClient

您正在尝试访问后台线程中的主/UI线程:

ItemOneFragment.this.movies2.add(电影)


只需返回
movie
对象并在
onPostExecute()
方法上执行上述行,我也不建议为每个请求实例化
OkHttpClient

您正试图从后台线程对UI线程执行操作。因此,您可以使用
runonuithread

runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                         ItemOneFragment.this.movies2.add(movie);
                    }
                });
请参阅下面代码中的更改

    @Override
    protected Void doInBackground(Integer... movieIds) {

        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(linkkk + movieIds[0])
                .build();
        try {
            Response response = client.newCall(request).execute();

            JSONArray array = new JSONArray(response.body().string());

            for (int i = 0; i < array.length(); i++) {

                JSONObject object = array.getJSONObject(i);

                Movie movie = new Movie(object.getInt("id") , object.getString("per") , object.getString("movie_name"),
                        object.getString("movie_image"), object.getString("movie_genre") , object.getString("movie_discription") , object.getString("movie_lat"), object.getString("movie_lon") , object.getString("movie_marker") , object.getString("sort") , object.getString("price") , object.getString("email") , object.getString("tell") , object.getString("location") , object.getString("count"));


                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                         ItemOneFragment.this.movies2.add(movie);
                    }
                });
            }


        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }
@覆盖
受保护的Void doInBackground(整数…电影ID){
OkHttpClient=新的OkHttpClient();
Request Request=newrequest.Builder()
.url(linkkk+movieIds[0])
.build();
试一试{
Response=client.newCall(request.execute();
JSONArray数组=新的JSONArray(response.body().string());
对于(int i=0;i

我认为这可能会解决您的问题。

您正在尝试从后台线程对UI线程执行操作。因此,您可以使用
runonuithread

runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                         ItemOneFragment.this.movies2.add(movie);
                    }
                });
请参阅下面代码中的更改

    @Override
    protected Void doInBackground(Integer... movieIds) {

        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(linkkk + movieIds[0])
                .build();
        try {
            Response response = client.newCall(request).execute();

            JSONArray array = new JSONArray(response.body().string());

            for (int i = 0; i < array.length(); i++) {

                JSONObject object = array.getJSONObject(i);

                Movie movie = new Movie(object.getInt("id") , object.getString("per") , object.getString("movie_name"),
                        object.getString("movie_image"), object.getString("movie_genre") , object.getString("movie_discription") , object.getString("movie_lat"), object.getString("movie_lon") , object.getString("movie_marker") , object.getString("sort") , object.getString("price") , object.getString("email") , object.getString("tell") , object.getString("location") , object.getString("count"));


                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                         ItemOneFragment.this.movies2.add(movie);
                    }
                });
            }


        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }
@覆盖
受保护的Void doInBackground(整数…电影ID){
OkHttpClient=新的OkHttpClient();
Request Request=newrequest.Builder()
.url(linkkk+movieIds[0])
.build();
试一试{
Response=client.newCall(request.execute();
JSONArray数组=新的JSONArray(response.body().string());
对于(int i=0;i