MainActivity.java has following code:
package com.softjourn.redmineclient.activities; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Base64; import android.view.Menu; import android.view.MenuItem; import android.widget.ArrayAdapter; import android.widget.ListView; import com.google.gson.JsonArray; import com.google.gson.JsonParser; import com.softjourn.redmineclient.R; import com.softjourn.redmineclient.models.Issue; import com.softjourn.redmineclient.models.IssuesResponse; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.ProtocolException; import java.net.URL; import butterknife.Bind; import butterknife.ButterKnife; public class MainActivity extends AppCompatActivity { private final static String URI="https://redmineng.softjourn.if.ua/issues.json?assigned_to_id=me"; @Bind(R.id.list_issues) ListView mListIssues; Login li; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); li = new Login(); li.execute(URI); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } class Login extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... strings) { HttpURLConnection c = null; try { c = (HttpURLConnection) new URL(strings[0]).openConnection(); } catch (IOException e) { e.printStackTrace(); } c.setUseCaches(false); try { c.setRequestMethod("GET"); } catch (ProtocolException e) { e.printStackTrace(); } c.setRequestProperty("Accept", "application/json"); c.setRequestProperty("Authorization", "basic " + Base64.encodeToString("osavchak:mhgT7322".getBytes(), 0)); try { c.connect(); } catch (IOException e) { e.printStackTrace(); } BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader((c.getInputStream()))); } catch (IOException e) { e.printStackTrace(); } StringBuilder sb = new StringBuilder(); String output; try { while ((output = br.readLine()) != null) { sb.append(output); } } catch (IOException e) { e.printStackTrace(); } return sb.toString(); } @Override protected void onPostExecute(String result) { super.onPostExecute(result); JsonArray ja = new JsonParser().parse(result).getAsJsonObject().getAsJsonArray("issues"); IssuesResponse ir = new IssuesResponse(ja); ArrayAdapter<Issue> adapter = new ArrayAdapter<Issue>(MainActivity.this, android.R.layout.simple_list_item_1, ir.getIssues()); mListIssues.setAdapter(adapter); } } }
I've created two model classes.
First, IssuesResponse.java:
package com.softjourn .redmineclient.models; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.annotations.SerializedName; import java.util.List; public class IssuesResponse { @SerializedName("issues") private List<Issue> issues; public IssuesResponse(JsonArray ja) { if (issues == null) { } for(JsonElement je : ja) { Issue issue = new Issue(je); issues.add(issue); } } public List<Issue> getIssues() { return issues; } }
The second one, Issue.java:
package com.softjourn.redmineclient.models; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.annotations.SerializedName; public class Issue { @SerializedName("id") private int id; @SerializedName("description") private String description; public Issue(JsonElement je) { Issue issue = new Gson().fromJson(je,Issue.class); this.id = issue.id; this.description = issue.description; } }
When I run my application an error occurs:
java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference at com.softjourn.redmineclient.models.IssuesResponse.(IssuesResponse.java:26) at com.softjourn.redmineclient.activities.MainActivity$Login.onPostExecute(MainActivity.java:125) at com.softjourn.redmineclient.activities.MainActivity$Login.onPostExecute(MainActivity.java:79) at android.os.AsyncTask.finish(AsyncTask.java:636) at android.os.AsyncTask.access$500(AsyncTask.java:177) at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
I wait for your suggestions how it could be fixed.
You haven't initialised List<Issue>
in the IssuesResponse class. Try
private List<Issue> issues = new ArrayList<>();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With