1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

NullPointerException bei AsyncTask

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von CMZoller, 31.05.2012.

  1. CMZoller, 31.05.2012 #1
    CMZoller

    CMZoller Threadstarter Junior Mitglied

    Beiträge:
    27
    Erhaltene Danke:
    2
    Registriert seit:
    11.12.2011
    Hallo,

    ich bin ziemlich neu in der Android-Entwicklung und habe mich bereits etwas eingearbeitet.

    Soweit klappt alles, doch jetzt stolper ich über ein Problem:
    Undzwar wird in Zeile eine NullPointerException und ich kann mir nicht erklären wieso.

    Alles klappt, bis ich ein Item aus der Liste auswähle und die Daten an die Activity übergeben will.
    Code:
    package com.android.npack;
    
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import android.app.Activity;
    import android.app.Dialog;
    import android.content.Context;
    import android.content.Intent;
    import android.net.http.AndroidHttpClient;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.TextView;
    import com.android.npack.HttpAccess;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    
    import android.app.ListActivity;
    import android.view.View;
    import android.view.animation.AnimationUtils;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.ListView;
    import android.widget.SimpleAdapter;
    import android.widget.Toast;
    
    
    
    public class npackActivity extends ListActivity{
    	private ArrayList<HashMap<String, String>> myListContent = 
    			new ArrayList<HashMap<String, String>>();
    	private SimpleAdapter adapter;
    	private ListView lv;
    	private int i;
    	static String[] newsId;
    	 static ArrayList<String> newsData = new ArrayList<String>();
    	 static ArrayList<String> newsData2 = new ArrayList<String>();
    	
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    //Working
            //String newsIds = HttpAccess.loadData("http://api.example.com/?ns=nid");
           // if(newsIds == "noconnection") {
            //	TextView nocContent = (TextView) findViewById(R.id.pleasewait);
    	     //    nocContent.setText("Verbindungsabbruch");
            	
            	
            //} else {
            //newsId = newsIds.split(" ");
            
            LoadHeadlinesTask task = new LoadHeadlinesTask();
    		task.execute();
           // }
    		
    		adapter = new SimpleAdapter(
            		this,
            		myListContent,
            		R.layout.two_line_list_item,
            		new String[] {"Headline", "Subheadline"},
            		new int[] {R.id.text1, R.id.text2});
        
            
            
          
        }
        
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.home_menu, menu);
            return super.onCreateOptionsMenu(menu);
        }
        
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.menu_impressum:        
            final Intent info_intent = new Intent(this, ImpressumActivity.class);         
            startActivity(info_intent);      
            break;
        case R.id.menu_feedback:        
            final Intent fb_intent = new Intent(this, FeedbackActivity.class);         
            startActivity(fb_intent);      
            break;
            default:          
        }
        return super.onOptionsItemSelected(item);
    }
        private class LoadHeadlinesTask extends AsyncTask<String, Void, String> {
    		@Override
    		protected String doInBackground(String... newsId) {
    			String newsIds = HttpAccess.loadData("http://api.example.com/?ns=nid");
    			if(newsIds == "noconnection") {
    				TextView nocContent = (TextView) findViewById(R.id.pleasewait);
    			    nocContent.setText("Verbindungsabbruch");
    			} else {
    			
    	        newsId = newsIds.split(" ");
    			//Load headlines an return them as array
    			for(i = 0; i <= 9; i++){
    	        	String newsInfos = HttpAccess.loadData("http://api.example.com/?ns=news&id="+newsId[i]);
    	        	JSONArray jsonArray;
    				try {
    					jsonArray = new JSONArray(newsInfos);
    					JSONObject jsonObject = jsonArray.getJSONObject(0);
    					String newsName = jsonObject.getString("name");
    					String newsSub = jsonObject.getString("untertitel");
    		 			
    		 			 newsData.add(i,newsName); 
    		 			
    		 			 newsData2.add(i,newsSub); 
    		 			 
    		 			 
    				} catch (JSONException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    			//return headlines
    			
    			}//End else
    			return "...";
    		}
    
    		@Override
    		protected void onPostExecute(String result) {
    			//Remove Please wait text
    			 View row = findViewById(R.id.pleasewait);
    			   
    			        row.startAnimation(AnimationUtils.loadAnimation(npackActivity.this, android.R.anim.fade_out));
    			        row.setVisibility(View.INVISIBLE);
    			        
    			        View row2 = findViewById(R.id.pleasewait2);
    					   
    			        row2.startAnimation(AnimationUtils.loadAnimation(npackActivity.this, android.R.anim.fade_out));
    			        row2.setVisibility(View.INVISIBLE);
    			   
    			//Set Data
    			/** Fill list with data*/
    		       
    	        for(i = 0; i <= 9; i++){
    	        	HashMap<String, String> item = new HashMap<String, String>();
    	        	String newsName = newsData.get(i);
    	        	String newsSub = newsData2.get(i);
    	        	item.put("Headline", newsName);
    	        	item.put("Subheadline", newsSub);
    	        	myListContent.add(item);
    	        	adapter.notifyDataSetChanged();
    	        }
    			
    			//Update
    	        adapter.notifyDataSetChanged();
    	        
    	        
    	        //Load intents after tapping on links
    	        
    	        
    	        setListAdapter(adapter);
    	        
    	        
    	        ListView lv = getListView();
    	      
    	        lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener(){
    	        	public void onItemClick(AdapterView<?> parent, View view, int position, long id){
    	        		HashMap<String, String> item;
    	        		item = myListContent.get(position);
    	        		 
    	        		Bundle b = new Bundle();
    	                String newId = newsId[position];
    	        		b.putString("nid", newId);
    	        		Intent newsActivity = new Intent(npackActivity.this, ReadNewsActivity.class);
    	        		newsActivity.putExtras(b);
    	        		
    	        		npackActivity.this.startActivity(newsActivity);
    	        		
    	        		myListContent.set(position, item);
    	        		adapter.notifyDataSetChanged();
    	        	}
    	        }); 	
    	        
    	        //Text2
    	        
    		}
    	}
    
        
    }
    
    Es handelt es sich um folgende Zeile:

    Code:
    String newId = newsId[position];
    
    Die App habe ich als Anhang hinzugefügt.
     

    Anhänge:

    • npack.apk
      Dateigröße:
      91.5 KB
      Aufrufe:
      45
    Zuletzt bearbeitet: 31.05.2012
  2. maniac103, 31.05.2012 #2
    maniac103

    maniac103 Android-Lexikon

    Beiträge:
    1,237
    Erhaltene Danke:
    1,157
    Registriert seit:
    24.01.2011
    Die Zuweisung zu newsIds passiert im Moment zu einer anderen Variable, als du denkst. Schau den Code nochmal genau an ;)

    BTW, warum ist newsIds static?

    Gesendet von meinem MB525 mit Tapatalk 2
     
    CMZoller bedankt sich.
  3. mkl, 31.05.2012 #3
    mkl

    mkl Fortgeschrittenes Mitglied

    Beiträge:
    316
    Erhaltene Danke:
    33
    Registriert seit:
    09.01.2011
    Mach nen try catch um die Zeile und debugge bis dahin dann bekommst meist ne eindeutige Information. Also nur

    try{
    //Zeile
    }
    catch(Exception e){
    e.printtostacktrace();
    }

    Bin grad nur n bissi eingeschränkt am Handy ;)

    Gesendet von meinem Galaxy Nexus mit der Android-Hilfe.de App
     
  4. maniac103, 01.06.2012 #4
    maniac103

    maniac103 Android-Lexikon

    Beiträge:
    1,237
    Erhaltene Danke:
    1,157
    Registriert seit:
    24.01.2011
    Er weiß doch aber schon, wo es crasht. Der Grund dafür ist ja, wie oben angedeutet, relativ offensichtlich.

    Gesendet von meinem MB525 mit Tapatalk 2
     
  5. Tom299, 01.06.2012 #5
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Wieso meckert Eclipse bei dir nicht? Oder seh ich was falsch?
    Code:
    String s = "xxxxxxxxx tttttttttt";
    s = s.split(" "); // das kann nicht gehen!!!
    
    Wenn du .split() benutzt, brauchst du ein String-Array. Bei dir ist newsId aber nur ein String:
    Code:
    String newsIds = HttpAccess.loadData(...)
    newsId = newsIds.split(" "); [COLOR="Red"]<-oh weh ;-)[/COLOR]
    
     
  6. CMZoller, 01.06.2012 #6
    CMZoller

    CMZoller Threadstarter Junior Mitglied

    Beiträge:
    27
    Erhaltene Danke:
    2
    Registriert seit:
    11.12.2011
    Werde am PC mal die Variablen umbenennen.
    newsId, newsIds und newId, da kann man durcheinander kommen.

    Kleiner Hinweis: Wenn ich jetzt auskommentierte Teil entkommentiere, klappt alles aber es dauert etwas, bis das UI angezeigt wird.

    Gesendet von meinem U8160 mit der Android-Hilfe.de App
     
  7. CMZoller, 02.06.2012 #7
    CMZoller

    CMZoller Threadstarter Junior Mitglied

    Beiträge:
    27
    Erhaltene Danke:
    2
    Registriert seit:
    11.12.2011
    So, habe mal die Variablen umbenannt und jetzt geht es...
    Bin mir zwar des Fehlers noch nicht ganz bewusst, aber das es geht dürfte fürs Erste reichen.

    Ich möchte mich für meine Dummheit entschuldigen und euch für eure Antworten danken :cool2:

    Bis demnächst ;)

    Der ursprüngliche Beitrag von 22:16 Uhr wurde um 22:18 Uhr ergänzt:

    @Tom:
    Natürlich handelte es sich dabei um zwei verschiedene (aber sehr ähnlich lautende) Variablen (s.o.)
     
  8. maniac103, 03.06.2012 #8
    maniac103

    maniac103 Android-Lexikon

    Beiträge:
    1,237
    Erhaltene Danke:
    1,157
    Registriert seit:
    24.01.2011
    Um meinen Hinweis mal aufzulösen: Du hattest zwei Variablen namens newsIds, hast auf die lokale Variable zugewiesen und erwartet, dass du auf die Membervariable zuweist ...

    Gesendet von meinem MB525 mit Tapatalk 2
     
  9. CMZoller, 03.06.2012 #9
    CMZoller

    CMZoller Threadstarter Junior Mitglied

    Beiträge:
    27
    Erhaltene Danke:
    2
    Registriert seit:
    11.12.2011
    Achso, ja stimmt!

    Danke, dort hatte ich bisher garnicht gesucht :banghead::banghead::banghead::banghead::banghead::banghead::banghead::banghead:

    Gesendet von meinem U8160 mit der Android-Hilfe.de App
     

Diese Seite empfehlen