Мое приложение состоит из 3 вкладок, и одна из вкладок переключает свои фрагменты на другой фрагмент. Оба фрагмента содержат списки. Моя проблема заключается в том, что если я нажму кнопку «Назад», когда список будет загружен данными из Интернета (с использованием asynctask), приложение выйдет из строя.Ошибка при смене фрагмента при обновлении listView
Функция, которая запускается на выполнение, когда 2-й фрагмент нагрузки: ошибка
void load(final String q) {
class HttpGetAsyncTask extends AsyncTask<String, Void, List<String>> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected List<String> doInBackground(String... params) {
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("url");
String v = null, c = null;
try {
HttpResponse httpResponse = httpClient.execute(httpGet);
InputStream inputStream = httpResponse.getEntity()
.getContent();
InputStreamReader inputStreamReader = new InputStreamReader(
inputStream);
BufferedReader bufferedReader = new BufferedReader(
inputStreamReader);
StringBuilder stringBuilder = new StringBuilder();
String bufferedStrChunk = null;
while ((bufferedStrChunk = bufferedReader.readLine()) != null) {
stringBuilder.append(bufferedStrChunk);
}
String js = stringBuilder.toString();
try {
JSONObject jsonObj = new JSONObject(js);
String[] n = new String[17];
for(int i = 6;i<=16;i++){
n[i] = jsonObj.getString("" + i);
}
for(int i=6;i<=16;i++){
HashMap<String, String> map = new HashMap<String, String>();
map.put("r", label_eq[i]);
map.put("c", n[i]);
fillMaps.add(map);
}
} catch (JSONException e) {
e.printStackTrace();
}
} catch (ClientProtocolException cpe) {
cpe.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
}
LIST.add(v);
LIST.add(c);
return LIST;
}
@Override
protected void onPostExecute(List<String> result) {
super.onPostExecute(result);
SimpleAdapter a = new SimpleAdapter(getActivity(), fillMaps,R.layout.my_list_item , from, to); //this is the line 158th line
l.setAdapter(a);
}
}
HttpGetAsyncTask httpGetAsyncTask = new HttpGetAsyncTask();
httpGetAsyncTask.execute();
}
LogCat:
10-25 12:43:34.423: E/AndroidRuntime(779): FATAL EXCEPTION: main
10-25 12:43:34.423: E/AndroidRuntime(779): java.lang.NullPointerException
10-25 12:43:34.423: E/AndroidRuntime(779): at android.widget.SimpleAdapter.<init>(SimpleAdapter.java:85)
10-25 12:43:34.423: E/AndroidRuntime(779): at yash.proj.stocks.eq$1HttpGetAsyncTask.onPostExecute(eq.java:158)
10-25 12:43:34.423: E/AndroidRuntime(779): at yash.proj.stocks.eq$1HttpGetAsyncTask.onPostExecute(eq.java:1)
10-25 12:43:34.423: E/AndroidRuntime(779): at android.os.AsyncTask.finish(AsyncTask.java:631)
10-25 12:43:34.423: E/AndroidRuntime(779): at android.os.AsyncTask.access$600(AsyncTask.java:177)
10-25 12:43:34.423: E/AndroidRuntime(779): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
10-25 12:43:34.423: E/AndroidRuntime(779): at android.os.Handler.dispatchMessage(Handler.java:99)
10-25 12:43:34.423: E/AndroidRuntime(779): at android.os.Looper.loop(Looper.java:137)
10-25 12:43:34.423: E/AndroidRuntime(779): at android.app.ActivityThread.main(ActivityThread.java:5041)
10-25 12:43:34.423: E/AndroidRuntime(779): at java.lang.reflect.Method.invokeNative(Native Method)
10-25 12:43:34.423: E/AndroidRuntime(779): at java.lang.reflect.Method.invoke(Method.java:511)
10-25 12:43:34.423: E/AndroidRuntime(779): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
10-25 12:43:34.423: E/AndroidRuntime(779): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
10-25 12:43:34.423: E/AndroidRuntime(779): at dalvik.system.NativeStart.main(Native Method)
Вы должны отменить свою задачу при уничтожении фрагмента. Сделайте свою задачу глобальной переменной и отмените ее на onDestroyView() функцию фрагмента. mTask.cancel (true) пример – hieuxit
@hieuxit Как вы предлагаете мне сделать мою задачу глобальной переменной? Это внутри функции. –
Поскольку onDestroyView() не обязательно вызывается каждый раз, я должен отменить его on onPause() –