【问题标题】:Problems parsing JSON on physical device in android在android中的物理设备上解析JSON的问题
【发布时间】:2020-06-11 07:22:53
【问题描述】:

我正在尝试构建一个从互联网获取新闻的应用程序。当我在 android studio 的模拟器上运行该应用程序时,它工作得很好,但是当我连接我的物理设备时,它给了我一个错误提示

2020-06-11 12:48:48.803 9567-9623/com.carrot.news E/NewsRepository: Problem parsing the JSON results
    org.json.JSONException: End of input at character 0 of 
        at org.json.JSONTokener.syntaxError(JSONTokener.java:467)
        at org.json.JSONTokener.nextValue(JSONTokener.java:101)
        at org.json.JSONObject.<init>(JSONObject.java:164)
        at org.json.JSONObject.<init>(JSONObject.java:181)
        at com.carrot.news.NewsRepository.extractNewsfromJSON(NewsRepository.java:122)
        at com.carrot.news.NewsRepository.access$200(NewsRepository.java:26)
        at com.carrot.news.NewsRepository$FetchJSONAsyncTask.doInBackground(NewsRepository.java:63)
        at com.carrot.news.NewsRepository$FetchJSONAsyncTask.doInBackground(NewsRepository.java:50)
        at android.os.AsyncTask$3.call(AsyncTask.java:378)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)

谁能帮我解决这些错误。

这是我的 MainActivity:


package com.carrot.news;

import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.util.Log;

import java.util.List;

public class MainActivity extends AppCompatActivity {

    private MainActivityViewModel mainActivityViewModel;
    private RecyclerView recyclerView;
    private RecyclerViewAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.news_view);




        mainActivityViewModel = ViewModelProviders.of(this).get(MainActivityViewModel.class);
        mainActivityViewModel.init();
        mainActivityViewModel.getNews().observe(this, new Observer<List<NewsData>>() {
            @Override
            public void onChanged(List<NewsData> newsData) {
                adapter.notifyDataSetChanged();
                Log.d("Main Activiy" , "Adapter notified of data change---------------------");
                System.out.println(mainActivityViewModel.getNews().getValue().size());
            }
        });
        init();

    }

    private void init(){
        Log.d("","=========================intializing Recycler view======================");
        System.out.println("executing init()");
        System.out.println(mainActivityViewModel.getNews().getValue().size());
        adapter = new RecyclerViewAdapter(mainActivityViewModel.getNews().getValue() , this);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setAdapter(adapter);
    }
}

这是 NewsRepository.java

package com.carrot.news;

import android.os.AsyncTask;
import android.util.Log;
import android.widget.ProgressBar;

import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

public class NewsRepository {

    private static NewsRepository instance;
    public static NewsRepository getInstance(){
        if(instance != null)
            return instance;
        instance = new NewsRepository();
        return instance;
    }

    private static final String LOG_TAG = "NewsRepository";
    private static final String newsAPIurl = "http://newsapi.org/v2/top-headlines?sources=google-news-in&apiKey";

    List<NewsData> newsData = new ArrayList<>();

    public MutableLiveData<List<NewsData>> getLiveNews(){
        new FetchJSONAsyncTask().execute();
        MutableLiveData<List<NewsData>> liveNews = new MutableLiveData<>();
        System.out.println("==========================================");
        liveNews.setValue(newsData);
        return liveNews;
    }


    public class FetchJSONAsyncTask extends AsyncTask<URL, Void , List<NewsData>>{
        @Override
        protected List<NewsData> doInBackground(URL... urls) {
            Log.d("Backgroumd thread" , "Fetching json");
            URL url = createUrl();
            String jsonRespone = "";
            try {
                jsonRespone = makeHttpRequest(url);
            }
            catch (IOException e) {
                Log.d("Background" , "Could not Load url");
            }

            extractNewsfromJSON(jsonRespone);
            return newsData;
        }


    }
    private URL createUrl() {
        URL url = null;
        try {
            url = new URL(NewsRepository.newsAPIurl);
        } catch (MalformedURLException exception) {
            Log.e(LOG_TAG, "Error with creating URL", exception);
            return null;
        }
        return url;
    }

    private String makeHttpRequest(URL url) throws IOException {
        String jsonResponse = "";
        HttpURLConnection urlConnection = null;
        InputStream inputStream = null;
        try {
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.setReadTimeout(10000);
            urlConnection.setConnectTimeout(15000);
            urlConnection.connect();
            inputStream = urlConnection.getInputStream();
            jsonResponse = readFromStream(inputStream);
        } catch (IOException e) {
            //  Handle the exception
        } finally {
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
            if (inputStream != null) {
                inputStream.close();
            }
        }
        return jsonResponse;
    }

    private String readFromStream(InputStream inputStream) throws IOException {
        StringBuilder output = new StringBuilder();
        if (inputStream != null) {
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
            BufferedReader reader = new BufferedReader(inputStreamReader);
            String line = reader.readLine();
            while (line != null) {
                output.append(line);
                line = reader.readLine();
            }

        }
        return output.toString();
    }

    private void extractNewsfromJSON(String newsJSON){
        try{
            JSONObject jsonObject = new JSONObject(newsJSON);
            String a = jsonObject.getString("status");
            String b = jsonObject.getString("totalResults");
            System.out.println("=================================================");
            System.out.println(a);
            System.out.println(b);
            JSONArray newsArray = jsonObject.getJSONArray("articles");

            if(newsArray.length()  > 0){
                for(int i =0 ;i<  newsArray.length();i++){
                    JSONObject article = newsArray.getJSONObject(i);
                    String title = article.getString("title");
                    String desc = article.getString("description");
                    String urltoimg = article.getString("urlToImage");
                    String readmore = article.getString("url");
                    NewsData obj = new NewsData(title , desc, readmore , urltoimg);
                    newsData.add(obj);
                }
            }
        } catch (JSONException e) {
            System.out.println(newsJSON);
            Log.e(LOG_TAG, "Problem parsing the JSON results", e);
        }
    }
}

这是 MainActivityViewModel

package com.carrot.news;

import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class MainActivityViewModel extends ViewModel {
    private NewsRepository instance;
    LiveData<List<NewsData>> LiveData;

    public void init(){
        if(instance != null)
            return;
        instance = NewsRepository.getInstance();
        LiveData = instance.getLiveNews();
    }

    public LiveData<List<NewsData>> getNews(){
        return LiveData;
    }
}

【问题讨论】:

  • 分享你尝试过的代码

标签: android json api


【解决方案1】:

您正在解析的 JSON 字符串是完全空白的。

            String jsonRespone = "";
            try {
                jsonRespone = makeHttpRequest(url);
            }
            catch (IOException e) {
                Log.d("Background" , "Could not Load url");
            }

是导致此错误的原因。与其忽略异常,不如将其记录在错误(或至少是警告)级别并重新引发它,以便 MainActivity 可以检测到它。然后 MainActivity 应该捕获它并安排重试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 2016-04-25
    相关资源
    最近更新 更多