java.lang.NullPointerException: Intenta invocar método de interfaz en un error de referencia de objeto nulo en OnPostExecute () – AsyncTask
Estoy tratando de obtener un resultado de un AsyncTask
que se mostrará en mi actividad de búsqueda.
Tuve un ejemplo de una aplicación anterior, que se hizo con la ayuda de un colega (yo era un pasante allí).
- Java.lang.NullPointerException: Intenta invocar el método virtual 'ActionBar.setNavigationMode (int)' en una referencia de objeto nulo
- Cómo solucionar esto: 'Running android lint' issue
- Facturación en aplicaciones v3 imposible de consultar elementos sin conexión de red o en modo avión / vuelo
- Android: getContext (). GetContentResolver () a veces obtiene NullPointerException
- Android: NullPointerException en android.app.ActivityThread $ PackageInfo $ ServiceDispatcher.doConnected (ActivityThread.java:1012)
He ajustado el ejemplo a las necesidades de esta aplicación, pero ahora estoy recibiendo la NullPointerException
:
03-04 03:50:23.865: E/AndroidRuntime(8224): FATAL EXCEPTION: main 03-04 03:50:23.865: E/AndroidRuntime(8224): Process: com.cyberdog.what2watch, PID: 8224 03-04 03:50:23.865: E/AndroidRuntime(8224): java.lang.NullPointerException: Attempt to invoke interface method 'void com.cyberdog.what2watch.JsonHandling$IOnFinish.onGetData(org.json.JSONObject)' on a null object reference 03-04 03:50:23.865: E/AndroidRuntime(8224): at com.cyberdog.what2watch.JsonHandlingTMDBAsync.onPostExecute(JsonHandling.java:321) 03-04 03:50:23.865: E/AndroidRuntime(8224): at com.cyberdog.what2watch.JsonHandlingTMDBAsync.onPostExecute(JsonHandling.java:1) 03-04 03:50:23.865: E/AndroidRuntime(8224): at android.os.AsyncTask.finish(AsyncTask.java:632) 03-04 03:50:23.865: E/AndroidRuntime(8224): at android.os.AsyncTask.access$600(AsyncTask.java:177) 03-04 03:50:23.865: E/AndroidRuntime(8224): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 03-04 03:50:23.865: E/AndroidRuntime(8224): at android.os.Handler.dispatchMessage(Handler.java:102) 03-04 03:50:23.865: E/AndroidRuntime(8224): at android.os.Looper.loop(Looper.java:135) 03-04 03:50:23.865: E/AndroidRuntime(8224): at android.app.ActivityThread.main(ActivityThread.java:5274) 03-04 03:50:23.865: E/AndroidRuntime(8224): at java.lang.reflect.Method.invoke(Native Method) 03-04 03:50:23.865: E/AndroidRuntime(8224): at java.lang.reflect.Method.invoke(Method.java:372) 03-04 03:50:23.865: E/AndroidRuntime(8224): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909) 03-04 03:50:23.865: E/AndroidRuntime(8224): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)
También he comprobado otras muestras en onPostExecute()
, y parece que hice lo correcto .. pero sigue recibiendo el error.
He utilizado un punto de interrupción en el onPostExecute()
y el resultado no es nulo, aunque ejecute el código dos veces.
código de la asincronia:
class JsonHandlingTMDBAsync extends AsyncTask<String, Void, JSONObject> {// params, // progress, // result private String api_key_tmdb = "2fb98d2bca5895c89a6efaf70903f706"; private String tmdb_multi_url = "http://api.themoviedb.org/3/search/multi?query="; int Total_pages; int number_entries_per_page; private JSONObject resultObject; private IOnFinish listener; String Titel=""; String Year =""; public JsonHandlingTMDBAsync(String titel, String year, IOnFinish listener) { this.listener = listener; this.Titel=titel; this.Year=year; } @Override protected JSONObject doInBackground(String... params) { return loadJSON(params); } private JSONObject loadJSON(String... params) { resultObject = new JSONObject(); StringBuilder builder = new StringBuilder(); HttpClient client = new DefaultHttpClient(); HttpGet httpGet; if (Titel.trim().length() == 0 && Year.trim().length() != 0) { httpGet = new HttpGet(tmdb_multi_url + Year + "&api_key=" + api_key_tmdb); } else if (Titel.trim().length() != 0 && Year.trim().length() == 0) { httpGet = new HttpGet(tmdb_multi_url + Titel + "&api_key=" + api_key_tmdb); } else if (Titel.trim().length() == 0 && Year.trim().length() == 0) { System.out.print("error null titel/year"); httpGet = new HttpGet(tmdb_multi_url + "star+wars&api_key=" + api_key_tmdb); } else { httpGet = new HttpGet( "http://www.omdbapi.com/?s=star&y=2008&r=JSON" + "&plot=short"); } try { HttpResponse response = client.execute(httpGet); StatusLine statusLine = response.getStatusLine(); int statusCode = statusLine.getStatusCode(); if (statusCode == 200) { HttpEntity entity = response.getEntity(); InputStream content = entity.getContent(); BufferedReader reader = new BufferedReader( new InputStreamReader(content)); String line; while ((line = reader.readLine()) != null) { builder.append(line); } } else { Log.e(JsonHandling.class.toString(), "Failed to download file"); } resultObject = new JSONObject(builder.toString()); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return resultObject; } @Override protected void onPostExecute(JSONObject result){ super.onPostExecute(result); listener.onGetData(result); }}
código de actividad:
package com.cyberdog.what2watch; import java.util.List; import org.json.JSONObject; import com.cyberdog.what2watch.JsonHandling.IOnFinish; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.view.inputmethod.InputMethodManager; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.Toast; public class SearchActivity extends Activity implements OnScrollListener, IOnFinish{ /** Called when the activity is first created. */ private static SearchCustomAdapter adapter; EditText tvTitel = null; EditText tvYear = null; ListView lvSearch = null; JsonHandling jh = new JsonHandling(this); int pageNumber =0; int previeusTotal=0; private static List<Serie> searchResult; private IOnFinish iof; private static List<Serie>series; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search); tvTitel = (EditText) findViewById(R.id.etf_search_titel); tvYear = (EditText) findViewById(R.id.etf_search_year); lvSearch = (ListView)findViewById(R.id.lvSearch); Button btnSearch = (Button) findViewById(R.id.btnSearch_search); btnSearch.setOnClickListener(new OnClickListener() { public void onClick(View v) { InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.hideSoftInputFromWindow(getCurrentFocus() .getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); JsonHandling.getInstance().getJSONFromUrl(tvTitel.getText().toString(), tvYear.getText().toString(),iof); } }); } public void search(int pageNumber){ // adapter for the custom list //lvSearch = (ListView) findViewById(R.id.lvSearch); // SearchCustomAdapter lvAdapt = new SearchCustomAdapter( // SearchActivity.this, jh.search_db(tvTitel.getText() // .toString(), tvYear.getText().toString(), // searchSite, pageNumber)); // lvSearch.setAdapter(lvAdapt); //lvAdapt.notifyDataSetChanged(); } @Override public void onGetData(JSONObject obj) { if (obj == null) { Toast.makeText(this, "obj is null", Toast.LENGTH_LONG).show(); Serie serie = new Serie("not found",""); Serie[] seriesList = new Serie[series.size()]; seriesList[0] = serie; adapter = new SearchCustomAdapter(this, seriesList); lvSearch = (ListView) findViewById(R.id.lvSearch); lvSearch.setAdapter(adapter); } if(obj !=null){ if (JsonHandling.pageNumber == 0){ series =Serie.serieListFromJSON(this, JsonHandling.getInstance().getJSONArraySerieFromUrlTMDB(obj)); Serie[] seriesList =series.toArray(new Serie[series.size()]); adapter = new SearchCustomAdapter(this, seriesList); lvSearch = (ListView)findViewById(R.id.lvSearch); lvSearch.setAdapter(adapter); //lvSearch.setOnItemClickListener(this); lvSearch.setOnScrollListener(this); }} } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { int lastInScreen = firstVisibleItem+visibleItemCount; totalItemCount = 20+20 * pageNumber; //int totalSearchResults = 0; Log.i("total, last in screen, pagenumber outside", totalItemCount+":" + lastInScreen+ ":"+pageNumber); if((lastInScreen +20*pageNumber == totalItemCount)){ Log.i("total, last in screen, pagenumber inside", totalItemCount+":" + lastInScreen+ ":"+pageNumber); pageNumber++; search(pageNumber); } else{ } } @Override public void onScrollStateChanged(AbsListView arg0, int arg1) { // TODO Auto-generated method stub } }
y el código de pieza json / interface:
public interface IOnFinish{ void onGetData(JSONObject obj); } public void getJSONFromUrl(String titel, String year, IOnFinish listener) { JsonHandlingTMDBAsync task = new JsonHandlingTMDBAsync(titel, year, listener); task.execute(); }
En mi clase de actividad tengo un punto de interrupción en el onGetData()
pero nunca se alcanza, aunque el onPostExecute()
tiene el objeto y se llama dos veces (no sé por qué).
- NullPointerException en android.app.ActivityThread.handleStopActivity
- NullPointerException en onLoaderFinished usando SimpleCursorAdapter
- NullPointerException en el método restartLoader de LoaderManager
- Posible motivo de "Error: no se pueden generar carpetas de vista java.lang.NullPointerException"
- NullPointerException en handleOnGetSentenceSuggestionsMultiple (SpellCheckerSession)
- NullPointerException al intentar pasar matriz de cadena de una clase a otra
- Buscador de Roman Nurik - cómo acceder a los datos recopilados?
- ViewRootImpl.setPausedForTransition (boolean) NullPointerException en ActivityTransitionCoordinator cuando la transición a otra Actividad se invoca demasiado pronto
Intenta invocar método de interfaz 'void com.cyberdog.what2watch.JsonHandling $ IOnFinish.onGetData
Debido a que el objeto de la interfaz IOnFinish
es null
.
Inicializar iof
después de setContentView
:
setContentView(R.layout.search); iof=this;
cuando llama a listener.onGetData(result);
, es mejor comprobar primero al oyente, como
if (listener != null) { listener.onGetData(result); }
porque no hay ninguna garantía de que el oyente no es nulo en su código.
- Obtener mensajes sin conexión en la aplicación de chat de Android con el uso de la biblioteca asmack
- cómo establecerImage en el lado derecho Textview Programatically