#java #android #nullreferenceexception
#java #Android #исключение nullreferenceexception
Вопрос:
У меня есть класс LoadJSONTask. В этом классе я получаю сообщение об ошибке, приведенное ниже. Мое приложение запущено, но когда я пытаюсь добавить индикатор выполнения в код, он не работает.
E/AndroidRuntime: FATAL EXCEPTION: main
Process: in.kalakaaristudios.json.listviewmenu, PID: 3809
java.lang.NullPointerException: Attempt to invoke interface method 'void in.kalakaaristudios.json.listviewmenu.LoadJSONTask$Listener.onLoaded(java.util.List)' on a null object reference
at in.kalakaaristudios.json.listviewmenu.LoadJSONTask$override.onPostExecute(LoadJSONTask.java:83)
at in.kalakaaristudios.json.listviewmenu.LoadJSONTask$override.access$dispatch(LoadJSONTask.java)
at in.kalakaaristudios.json.listviewmenu.LoadJSONTask.onPostExecute(LoadJSONTask.java:0)
at in.kalakaaristudios.json.listviewmenu.LoadJSONTask.onPostExecute(LoadJSONTask.java:21)
at android.os.AsyncTask.finish(AsyncTask.java:651)
at android.os.AsyncTask.access$500(AsyncTask.java:180)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5441)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628)
Класс LoadJSONTask
package in.kalakaaristudios.json.listviewmenu;
import android.os.AsyncTask;
import android.view.View;
import android.widget.ProgressBar;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
public class LoadJSONTask extends AsyncTask<String, Void, Response> {
private MainActivity activity;
private ProgressBar dwBar;
public LoadJSONTask(MainActivity activity) {
this.activity = activity;
dwBar = (ProgressBar) activity.findViewById(R.id.progress_bar);
}
public LoadJSONTask(Listener listener) {
mListener = listener;
}
public interface Listener {
void onLoaded(List<AndroidVersion> androidList);
void onError();
}
private Listener mListener;
@Override
protected Response doInBackground(String... strings) {
try {
String stringResponse = loadJSON(strings[0]);
Gson gson = new Gson();
return gson.fromJson(stringResponse, Response.class);
} catch (IOException e) {
e.printStackTrace();
return null;
} catch (JsonSyntaxException e) {
e.printStackTrace();
return null;
}
}
@Override
protected void onPreExecute() {
super.onPreExecute();
MainActivity mn = new MainActivity();
dwBar.setVisibility(View.VISIBLE);
}
@Override
protected void onPostExecute(Response response) {
dwBar.setVisibility(View.GONE);
if (response != null) {
mListener.onLoaded(response.getAndroid());//getting error here
} else {
mListener.onError();
}
}
private String loadJSON(String jsonURL) throws IOException {
URL url = new URL(jsonURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.connect();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
StringBuilder response = new StringBuilder();
while ((line = in.readLine()) != null) {
response.append(line);
}
in.close();
return response.toString();
}
}
MainActivity.java
package in.kalakaaristudios.json.listviewmenu;
import android.os.AsyncTask;
import android.view.View;
import android.widget.ProgressBar;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
public class LoadJSONTask extends AsyncTask<String, Void, Response> {
private MainActivity activity;
private ProgressBar dwBar;
public LoadJSONTask(MainActivity activity) {
this.activity = activity;
dwBar = (ProgressBar) activity.findViewById(R.id.progress_bar);
}
public LoadJSONTask(Listener listener) {
mListener = listener;
}
public interface Listener {
void onLoaded(List<AndroidVersion> androidList);
void onError();
}
private Listener mListener;
@Override
protected Response doInBackground(String... strings) {
try {
String stringResponse = loadJSON(strings[0]);
Gson gson = new Gson();
return gson.fromJson(stringResponse, Response.class);
} catch (IOException e) {
e.printStackTrace();
return null;
} catch (JsonSyntaxException e) {
e.printStackTrace();
return null;
}
}
@Override
protected void onPreExecute() {
super.onPreExecute();
MainActivity mn = new MainActivity();
dwBar.setVisibility(View.VISIBLE);
}
@Override
protected void onPostExecute(Response response) {
dwBar.setVisibility(View.GONE);
if (response != null) {
mListener.onLoaded(response.getAndroid());
} else {
mListener.onError();
}
}
private String loadJSON(String jsonURL) throws IOException {
URL url = new URL(jsonURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.connect();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
StringBuilder response = new StringBuilder();
while ((line = in.readLine()) != null) {
response.append(line);
}
in.close();
return response.toString();
}
}
Ответ №1:
Я думаю, что ваша проблема в этой строке
dwBar = (ProgressBar) activity.findViewById(R.id.progress_bar);
поскольку вы используете экземпляр класса activity для получения ссылки на ваш виджет просмотра панели прогресса
Вы должны раздуть макет, содержащий виджет ProgressBar, и использовать find для получения экземпляра вашей ProgressBar
View view = inflater.inflate(R.Layout_that_contains_progress_bar, null);
dwBar = (ProgressBar) activity.findViewById(R.id.progress_bar);
Кроме того, вы можете создать ProgressBar программно, как показано ниже
dwBar = new ProgressBar(activity);