json을 구문 분석하고 recyclerview로 설정할 수 없습니다.

닐 아가 왈

안녕하세요 저는 Android 앱 개발을 배우고 있습니다. 이를 위해 간단한 배경 화면 앱을 만들고 싶었습니다. 따라서 여기에 제시된 내용을 대략적으로 썼습니다. json에서 배경 화면 URL을 얻고 싶습니다. 안타깝게도 서버에서 데이터를 가져올 수 없습니다. java.lang.NullPointerException: Attempt to read from null arrayjsonParse asynctask에서 데이터를 올바르게 가져 오는 방법은 무엇입니까? 나는 이것에 하루 종일 붙어 있습니다. 여기서 무엇이 잘못되었을 수 있습니까? 내 코드는 다음과 같습니다.

myjson.json :

{
    "walls":[
                   {"ourUrl":"http://www.hdbloggers.net/wp-content/uploads/2016/01/Wallpapers-for-Android.jpg"},
                   {"ourUrl":"http://androidwallpape.rs/content/02-wallpapers/131-night-sky/wallpaper-2707591.jpg"},
                   {"ourUrl":"http://androidwallpape.rs/content/02-wallpapers/155-starrynight/starry-night-sky-star-galaxy-space-dark-9-wallpaper.jpg"}
            ]
}

MainActivity.java :

package regalstreak.me.wallpapers;

import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

public class MainActivity extends Activity {

    RecyclerView recyclerView;
    RecyclerView.LayoutManager layoutManager;
    RecyclerView.Adapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = (RecyclerView)findViewById(R.id.recycler_view);
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        adapter = new RecyclerAdapter(this);
        recyclerView.setAdapter(adapter);

    }

}

RecyclerAdapter.java :

package regalstreak.me.wallpapers;

import android.content.Context;
import android.os.AsyncTask;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import org.apache.commons.io.IOUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;

// This is a recycleradapter which will set the correct images to the correct position in the recyclerview.

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {

    private Context myCtx1;
    String[] arr;
    String[] arrurl;
    String jsonURL = "http://dev.regalstreak.me/myjson.json";

    public RecyclerAdapter(Context ctx) {
        this.myCtx1 = ctx;
    }

    public ImageView Image;

    private String[] mText = {
            "Text 1",
            "Text 2",
            "Text 3"
    };

    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView Text;

        public ViewHolder(View itemView) {
            super(itemView);

            Image = (ImageView) itemView.findViewById(R.id.image_view);
            Text = (TextView) itemView.findViewById(R.id.text_view);
        }
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.wallpapers_list, viewGroup, false);

        ViewHolder viewHolder = new ViewHolder(v);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int i) {
        viewHolder.Text.setText(mText[i]);
        new jsonParse().execute();
        new DownloadImageTask(Image).execute(arrurl[i]);
    }

    @Override
    public int getItemCount() {
        return mText.length;
    }

    class jsonParse extends AsyncTask<String, Void, String[]> {

        protected String[] doInBackground(String[] urls) {
            String myText = null;
            String url = urls[0];
            String ourUrl;

            try {
                InputStream in = new java.net.URL(jsonURL).openStream();
                myText = IOUtils.toString(in, "utf-8");
                in.close();

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }


            try {
                // Parse the json
                List<String> allUrls = new ArrayList<String>();

                JSONObject jsonObjectRoot = new JSONObject(myText);
                JSONArray jsonArray = jsonObjectRoot.getJSONArray("walls");

                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                    ourUrl = jsonObject.getString("ourUrl");
                    allUrls.add(ourUrl);
                }

                arr = allUrls.toArray(new String[allUrls.size()]);

            } catch (JSONException e) {
                e.printStackTrace();
            }

            return arr;
        }

        protected void onPostExecute(String[] result){
            arrurl = result;
        }
    }

}

DownloadImageTask.java :

package regalstreak.me.wallpapers;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.ImageView;

import java.io.InputStream;

// Here, we will download the wallpapers obtained from jsonData with an asynctask.

public class DownloadImageTask extends AsyncTask<String, Void, Bitmap>{

    ImageView bmImage;

    public DownloadImageTask(ImageView bmImage){
        this.bmImage = bmImage;
    }

    protected Bitmap doInBackground(String... urls) {
        String urldisplay = urls[0];
        Bitmap mIcon11 = null;
        try {
            InputStream in = new java.net.URL(urldisplay).openStream();
            mIcon11 = BitmapFactory.decodeStream(in);
            in.close();
        } catch (Exception e) {
            Log.e("Error getting images.", e.getMessage());
            e.printStackTrace();
        }

        return mIcon11;
    }

    protected void onPostExecute(Bitmap result){
        bmImage.setImageBitmap(result);
    }

}

activity_main.xml :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="regalstreak.me.wallpapers.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/recycler_view" />

</RelativeLayout>

wallpaper_list.xml :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relative"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="5dp">

    <ImageView
        android:id="@+id/image_view"
        android:layout_width="match_parent"
        android:layout_height="150dp" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@id/image_view"
        android:alpha="0.6"
        android:background="@color/colorDivider"
        android:padding="9dp">

        <TextView
            android:id="@+id/text_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textAlignment="center"
            android:textColor="@color/colorPrimaryText" />

    </RelativeLayout>

</RelativeLayout>
SanVed

빠른 응답과 캐시와 같은 기능을 위해 여기에서 HttpURLConnection 클래스를 사용했습니다. URL에서 수신 된 데이터는 입력 스트림에 추가되고 JSON 클래스와 함께 사용할 수있는 문자열 객체를 얻기 위해 문자열 빌더로 변환됩니다.

추신-AsyncTask 코드를 MainActivity 자체에 추가하고이를 위해 별도의 Java 파일을 만들지 마십시오.

팁-항상이 도구를 사용하여 json 확인-jsonlint.com

MainActivity

/*

your code

*/

@Override
protected void onCreate(Bundle savedInstanceState) {

        new MyAsyncTask().execute("");

}

class MyAsyncTask extends AsyncTask<String, String, Void> {

    private ProgressDialog progressDialog = new ProgressDialog(StartScreen.this);
    InputStream inputStream = null;
    String result = "";
    ArrayList<String> list;

    protected void onPreExecute() {
        progressDialog.setTitle("Downloading JSON Data");
        progressDialog.show();
        // above code makes a dialog with a progress bar
    }

    @Override
    protected Void doInBackground(String... params) {
        ArrayList<String> param = new ArrayList<String>();
        URL url, url2;

        try{
            url = new URL("http://dev.regalstreak.me/myjson.json");
            // link to your json file
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setUseCaches(false);
            inputStream = new BufferedInputStream(urlConnection.getInputStream());

        }catch (MalformedURLException malle){
            Log.e("Mal", ""+malle);
            malle.printStackTrace();
        }catch (IOException ioe){
            Log.e("IO", ""+ioe);
            ioe.printStackTrace();
        }

        // Convert response to string using String Builder
        try {
            BufferedReader bReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"), 8);
            StringBuilder sBuilder = new StringBuilder();

            String line = null;
            while ((line = bReader.readLine()) != null) {
                sBuilder.append(line + "\n");
            }

            inputStream.close();
            result = sBuilder.toString();

        } catch (Exception e) {
            Log.e("StringBuilding", "Error converting result " + e.toString());
        }
        return null;
    }

    protected void onPostExecute(Void v) {

        //parse JSON data
        try {
            JSONObject jobj = new JSONObject(result);
            //Taking a JSON Array from the JSONObject created above

            String url = jobj.getString("ourUrl");

            // We are adding this string to the ArrayList

            list.add(url);

            progressDialog.dismiss();
            Context con = ListLoader.this.getApplication();
            adapter = new RecyclerAdapter(list,con);

            recyclerView.setAdapter(adapter);

        } catch (JSONException e) {
            Log.e("JSONException", "Error: " + e.toString());
        } // catch (JSONException e)
    }

}


/*

your code

*/

이제 목록에 이미지를 더 효과적으로 표시하려면 repo Universal 이미지 로더를 사용하십시오. 그것은 많은 기능을 가지고 있습니다. 여기에서 얻을 수 있습니다-https: //github.com/nostra13/Android-Universal-Image-Loader

그런 다음 이러한 종류의 코드를 추가하여 이미지를 표시합니다. onBindViewHolder 안에 넣으십시오.

어댑터

@Override
public void onBindViewHolder(DataHolder holder, int position) {
    ImageLoaderConfiguration config;
    config = new ImageLoaderConfiguration.Builder(mContext).build();
    ImageLoader.getInstance().init(config);
    imageLoader = ImageLoader.getInstance();

    DisplayImageOptions options = new DisplayImageOptions.Builder()
    .showImageForEmptyUri(R.drawable.ic_error_black_48dp) // displays this image not found
    .showImageOnFail(R.drawable.ic_error_black_48dp) // Displays this on failure
    .showImageOnLoading(R.drawable.white) // Displays while loading
    .cacheInMemory(false)
    .cacheOnDisk(true)
    .build();

    imageLoader.displayImage(list.get(position), holder.imageView, options);    
    // We are feeding the urls here. 
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Pandas로 JSON 파일을 구문 분석 할 수 없습니다.

분류에서Dev

JSON을 Javascript 개체로 구문 분석 할 수 없습니다.

분류에서Dev

문자열을 정수 값으로 구문 분석 할 수 없습니다.

분류에서Dev

JAXB로 응답을 구문 분석 할 수 없습니다.

분류에서Dev

Logstash로 CSV 파일을 구문 분석 할 수 없습니다.

분류에서Dev

JSON 배열을 제대로 구문 분석 할 수 없습니다.

분류에서Dev

AlamoFire 및 SwiftyJSON으로 JSON을 구문 분석 할 수 없습니다.

분류에서Dev

점수 공개 Android 구문 분석의 ACL을 설정할 수 없습니다.

분류에서Dev

때때로 gson을 사용하여 json에서 날짜를 구문 분석 할 수 없습니다.

분류에서Dev

typesafe 구성은 변수로 URL을 구문 분석 할 수 없습니다.

분류에서Dev

Gson을 사용하여 Json 배열을 구문 분석 할 수 없습니다.

분류에서Dev

gson을 사용하여 json을 구문 분석 할 수 없습니다.

분류에서Dev

NumberFormatException이 "66"을 정수로 구문 분석하려고합니다.

분류에서Dev

NumberFormatException이 "66"을 정수로 구문 분석하려고합니다.

분류에서Dev

ROBLOX Lua에서 JSON을 구문 분석 할 수 없습니다.

분류에서Dev

ROBLOX Lua에서 JSON을 구문 분석 할 수 없습니다.

분류에서Dev

JSON을 구문 분석 할 수 없습니다.

분류에서Dev

SwiftyJSON이 JSON 배열을 구문 분석 할 수 없습니다.

분류에서Dev

JSON REST API 응답을 구문 분석 할 수 없습니다.

분류에서Dev

JSON 응답을 구문 분석 할 수 없습니다.

분류에서Dev

문자열을 분할하고 int로 구문 분석하고 다른 변수에 할당

분류에서Dev

콜론으로 문자열을 구문 분석하고 양쪽을 다른 변수로 설정, C ++

분류에서Dev

dojo를 사용하여 JSON을 구문 분석 할 수 없습니다.

분류에서Dev

NewtonSoft JSONConvert를 사용하여 JSON을 구문 분석 할 수 없습니다.

분류에서Dev

jquery 변수에 ajax 문자열을 구문 분석하고 반환 할 수 없습니다.

분류에서Dev

XML 문자열을 SimpleXMlElement로 구문 분석 할 수 없습니다.

분류에서Dev

XML 문자열을 SimpleXMlElement로 구문 분석 할 수 없습니다.

분류에서Dev

Groovy는 문자열을 날짜로 구문 분석 할 수 없습니다.

분류에서Dev

문자열에서 DATETIME으로 DataTime을 구문 분석 할 수 없습니다.

Related 관련 기사

  1. 1

    Pandas로 JSON 파일을 구문 분석 할 수 없습니다.

  2. 2

    JSON을 Javascript 개체로 구문 분석 할 수 없습니다.

  3. 3

    문자열을 정수 값으로 구문 분석 할 수 없습니다.

  4. 4

    JAXB로 응답을 구문 분석 할 수 없습니다.

  5. 5

    Logstash로 CSV 파일을 구문 분석 할 수 없습니다.

  6. 6

    JSON 배열을 제대로 구문 분석 할 수 없습니다.

  7. 7

    AlamoFire 및 SwiftyJSON으로 JSON을 구문 분석 할 수 없습니다.

  8. 8

    점수 공개 Android 구문 분석의 ACL을 설정할 수 없습니다.

  9. 9

    때때로 gson을 사용하여 json에서 날짜를 구문 분석 할 수 없습니다.

  10. 10

    typesafe 구성은 변수로 URL을 구문 분석 할 수 없습니다.

  11. 11

    Gson을 사용하여 Json 배열을 구문 분석 할 수 없습니다.

  12. 12

    gson을 사용하여 json을 구문 분석 할 수 없습니다.

  13. 13

    NumberFormatException이 "66"을 정수로 구문 분석하려고합니다.

  14. 14

    NumberFormatException이 "66"을 정수로 구문 분석하려고합니다.

  15. 15

    ROBLOX Lua에서 JSON을 구문 분석 할 수 없습니다.

  16. 16

    ROBLOX Lua에서 JSON을 구문 분석 할 수 없습니다.

  17. 17

    JSON을 구문 분석 할 수 없습니다.

  18. 18

    SwiftyJSON이 JSON 배열을 구문 분석 할 수 없습니다.

  19. 19

    JSON REST API 응답을 구문 분석 할 수 없습니다.

  20. 20

    JSON 응답을 구문 분석 할 수 없습니다.

  21. 21

    문자열을 분할하고 int로 구문 분석하고 다른 변수에 할당

  22. 22

    콜론으로 문자열을 구문 분석하고 양쪽을 다른 변수로 설정, C ++

  23. 23

    dojo를 사용하여 JSON을 구문 분석 할 수 없습니다.

  24. 24

    NewtonSoft JSONConvert를 사용하여 JSON을 구문 분석 할 수 없습니다.

  25. 25

    jquery 변수에 ajax 문자열을 구문 분석하고 반환 할 수 없습니다.

  26. 26

    XML 문자열을 SimpleXMlElement로 구문 분석 할 수 없습니다.

  27. 27

    XML 문자열을 SimpleXMlElement로 구문 분석 할 수 없습니다.

  28. 28

    Groovy는 문자열을 날짜로 구문 분석 할 수 없습니다.

  29. 29

    문자열에서 DATETIME으로 DataTime을 구문 분석 할 수 없습니다.

뜨겁다태그

보관