【发布时间】: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;
}
}
【问题讨论】:
-
分享你尝试过的代码