Issue
I'm creating a news app. Usaly when I getting HTTP data it works fine, but now in my app I'm using RecyclerView+CardView and I've (I supose some kind of logical error because of it). I've tried to use different libraries like OkHttp and Retrofit but the doesn't work as well. I completley sure that I've got a core misunderstanding.
public class MainActivity extends AppCompatActivity {
private List<Message> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list = new ArrayList<>();
DownloadTask task = new DownloadTask();
String result = null;
try {
result = task.execute("https://newsapi.org/v2/top-headlines?country=us&apiKey=(MyApi)").get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setHasFixedSize(true);
AtomicReference<MyCustomAdapter> adapter = null;
adapter.set(new MyCustomAdapter(initData(result)));
Log.i("result","Heh "+result);
recyclerView.setAdapter(adapter.get());
}
private List<Message> initData(String myDataString) {
representData(myDataString);
return list;
}
private void representData(String myJSONDataString){
JsonParser parser = new JsonParser();
JsonObject rootObj = parser.parse(myJSONDataString).getAsJsonObject();
JsonArray articlesArray = rootObj.getAsJsonArray("articles");
for (JsonElement aa : articlesArray) {
JsonObject articleObj = aa.getAsJsonObject();
String title = articleObj.get("title").getAsString();
String description = articleObj.get("description").getAsString();
list.add(new Message(title,description));
}
}
public class DownloadTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
String result = "";
URL url;
HttpURLConnection urlConnection = null;
try {
url = new URL(urls[0]);
urlConnection = (HttpURLConnection)url.openConnection();
InputStream in = urlConnection.getInputStream();
InputStreamReader reader = new InputStreamReader(in);
int data = reader.read();
while (data != -1) {
char current = (char) data;
result += current;
data = reader.read();
}
return result;
}
catch(Exception e) {
e.printStackTrace();
return "Failed";
}
}
}
} LogCat
05-21 07:19:48.414 12126-12126/com.example.gmachine.mynewsapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.gmachine.mynewsapp, PID: 12126
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.gmachine.mynewsapp/com.example.gmachine.mynewsapp.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void java.util.concurrent.atomic.AtomicReference.set(java.lang.Object)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2804)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2875)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1578)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:6623)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void java.util.concurrent.atomic.AtomicReference.set(java.lang.Object)' on a null object reference
at com.example.gmachine.mynewsapp.MainActivity.onCreate(MainActivity.java:61)
at android.app.Activity.performCreate(Activity.java:6910)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2757)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2875)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1578)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:6623)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
05-21 07:19:48.461 12126-12126/? I/Process: Sending signal. PID: 12126 SIG: 9
Solution
change
AtomicReference<MyCustomAdapter> adapter = null;
to
AtomicReference<MyCustomAdapter> adapter = new AtomicReference<>();
Also, please read your error log carefully next time. It clearly states that you have a NullPointerException
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void java.util.concurrent.atomic.AtomicReference.set(java.lang.Object)' on a null object reference
Answered By - MohammedAlSafwan
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.