2014-10-28 65 views
2

我正在开发一个新闻Android应用程序,填写列表视图时,我有以下代码充满文字和图片来自在线服务器列表视图:奇怪的空指针异常从在线数据库

package info.androidhive.actionbar; 



import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.URL; 
import java.net.URLDecoder; 
import java.util.ArrayList; 
import java.util.HashMap; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.annotation.TargetApi; 
import android.app.ActionBar; 
import android.app.ListActivity; 
import android.app.ProgressDialog; 
import android.app.SearchManager; 
import android.content.Context; 
import android.content.Intent; 
import android.content.pm.ActivityInfo; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Color; 
import android.graphics.drawable.Drawable; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.os.AsyncTask; 
import android.os.Build; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.StrictMode; 
import android.text.Spannable; 
import android.text.SpannableString; 
import android.text.style.ImageSpan; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class News extends ListActivity implements 
ActionBar.OnNavigationListener { 

    private ProgressDialog pd; 
    Handler handler; 
    ArrayList<NameValuePair> nameValuePairs; 
    HttpResponse response; 
    HttpEntity entity; 
    HttpClient httpclient; 
    String wholepost=""; 
// CustomAdapter adapter; 
    HttpPost httppost; 
    TextView scrolltext; 
    //String date,content,sender1,sender2,mid,nc; 
    CategoryAdapter adapter; 
    String type,username,title,nc,content,date,time,internet="yes"; 
    private ListView listView1; 
    private String titlearray[]; 
    private String contentarray[]; 
    private String datearray[]; 
    private String task_type[]; 
    private String deleted_task[]; 
    private String task_id[]; 
    String[] postsinarray; 
    String[] arrayinlist; 
    JSONArray arr; 
    Bitmap[] bit=null; 
    //String type; 

    private ActionBar actionBar; 


    // Refresh menu item 
    private MenuItem refreshMenuItem; 


    ArrayList<HashMap<String, Object>> searchResults; 


    ArrayList<HashMap<String, Object>> originalValues; 
    LayoutInflater inflater; 

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) 
@Override 
    public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 

setContentView(R.layout.activity_main); 
// final ListView playerListView=(ListView) findViewById(android.R.id.list); 


    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); 

    forceRTLIfSupported(); 

    actionBar = getActionBar(); 
    actionBar.setDisplayShowTitleEnabled(true); 
    actionBar.setTitle("أخبار الساعة"); 


scrolltext=(TextView) findViewById(R.id.textView1); 
scrolltext.setText(""); 
scrolltext.setTextColor(Color.BLACK); 



pd=new ProgressDialog(News.this,R.style.TransparentProgressDialog); 
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
pd.setMessage("جار تحميل الأخبار"); 
pd.setCancelable(false); 
pd.setIndeterminate(true); 
handler=new Handler(); 



inflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

/////////////////////////////////////////////////////////////////////// 

ConnectivityManager cm =(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
if (netInfo != null && netInfo.isConnectedOrConnecting()) 

{ 

// new ProgressTask().execute(); 

///////////////////////////////////////////////////////////////////////////////////////////////////////////// 
    pd.show(); 
    Thread thread = new Thread() { 

     public void run() { 
      StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
      StrictMode.setThreadPolicy(policy); 


      //httpclient = new DefaultHttpClient(); 
      httpclient = new DefaultHttpClient(); 
      String type2="moonwalker"; 
      httppost = new HttpPost("http://www.mypage.com/myfolder/mypage.php?Username="+type2+""); 
      try 
      { 
      nameValuePairs = new ArrayList<NameValuePair>(); 
      nameValuePairs.add(new BasicNameValuePair("Type",type)); 
      nameValuePairs.add(new BasicNameValuePair("Date",date)); 
      nameValuePairs.add(new BasicNameValuePair("Title",title)); 
      nameValuePairs.add(new BasicNameValuePair("Content",content)); 
      nameValuePairs.add(new BasicNameValuePair("Time",time)); 

      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,"UTF-8")); 
      response = httpclient.execute(httppost); 



      if(response.getStatusLine().getStatusCode()==200) 
      { 

      entity=response.getEntity(); 
      if(entity !=null) 
      { 
       InputStream instream=entity.getContent(); 
      try { 
      JSONArray jArray = new JSONArray(convertStreamToString(instream)); 
arr=jArray; 
     // int jArrayLength = arr.length(); 
      postsinarray = new String[arr.length()]; 
      arrayinlist=new String[arr.length()]; 

      //final List<String> listContents = new ArrayList<String>(jArrayLength); 
      //thelist=listContents; 


      Category task_data[] = new Category[arr.length()]; 

       titlearray=new String[arr.length()]; 
      contentarray=new String[arr.length()]; 
      datearray=new String[arr.length()]; 
      task_type=new String[arr.length()]; 
      task_id=new String[arr.length()]; 
      deleted_task=new String[arr.length()]; 

     for(int i =0; i<arr.length(); i++){ 
try 
{ 
      JSONObject json_data = arr.getJSONObject(i); 


    //  String postcontent=new String(json_data.getString("Content").getBytes("ISO-8859-1"), "UTF-8"); 

     // String TAG_ID = null; 
     String postcontent=URLDecoder.decode(json_data.getString("Content"), "UTF-8"); 
     wholepost= wholepost+postcontent+"\t\t\t\t"; 

     contentarray[i]=postcontent; 

     if(postcontent.length()>64) 
     { 
      String subpost=postcontent.substring(0,50); 
      String newcontent=subpost+"..."; 
      nc=newcontent; 

     } 
     else 
     { 
      nc=postcontent; 
     } 



     String posttype=json_data.getString("Type"); 

     task_type[i]=posttype; 
     StrictMode.ThreadPolicy policy1= new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 

     URL newurl = new URL("http://mypage.com/myfolder/photos/mini_"+posttype+".jpg"); 
     Bitmap mIcon_val = BitmapFactory.decodeStream(newurl.openConnection() .getInputStream()); 


     task_data[i]=new Category(mIcon_val, json_data.getString("Title"),nc,json_data.getString("Date"),json_data.getString("Taskid")); 
     titlearray[i]=json_data.getString("Title"); 
     datearray[i]=json_data.getString("Date"); 

     task_id[i]=json_data.getString("Taskid"); 




adapter = new CategoryAdapter(News.this, R.layout.list_row, task_data); 






//listcount=listView1.getCount(); 

}catch(Exception ex){Toast.makeText(getBaseContext(), ex.toString(), Toast.LENGTH_LONG).show();} 
     } 



      pd.dismiss(); 


      }catch(JSONException e){ 

      }}} 
      }//End of first try 

      catch(Exception e) 
      { 
      // Toast.makeText(getBaseContext(),"CONNECTION ERROR",Toast.LENGTH_LONG).show(); 

      } 
      handler.post(new Runnable() { 
       @Override 
       public void run() { 

        listView1 = (ListView)findViewById(android.R.id.list); 

        listView1.setAdapter(adapter); 


        adapter.notifyDataSetChanged(); 

        SpannableString ss = new SpannableString("\t\t\t\t"+wholepost); 
        Drawable d = getResources().getDrawable(R.drawable.mini_globe); 
        d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); 
        ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE); 
        ss.setSpan(span, 0, 3, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
        scrolltext.setText(ss); 

        pd.dismiss(); 

       } 
      }); 

     } 

    }; 

    thread.start(); 
/////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// End of first catch 
} 
else 
{ 
    Toast.makeText(getBaseContext(),"No internet connection", Toast.LENGTH_LONG).show();  
} 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 




listView1 = (ListView)findViewById(android.R.id.list); 
listView1.setOnItemClickListener(new OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     // TODO Auto-generated method stub 

     ConnectivityManager cm =(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
     if (netInfo != null && netInfo.isConnectedOrConnecting()) 
     { 
      String postcontent=contentarray[arg2]; 
      String posttitle=titlearray[arg2]; 
      String postphoto=task_type[arg2]; 



      Intent intent = new Intent(News.this, Postcontent.class); 

       // 2. put key/value data 
       intent.putExtra("message", "Hello From MainActivity"); 

       // 3. or you can add data to a bundle 
       Bundle extras = new Bundle(); 
       extras.putString("title",posttitle); 
       extras.putString("content",postcontent); 
       extras.putString("photo",postphoto); 

       // 4. add bundle to intent 
       intent.putExtras(extras); 

       // 5. start the activity 
       startActivity(intent); 
     } 
     else 
     { 
      Toast.makeText(getBaseContext(),"No internet connection", Toast.LENGTH_LONG).show(); 
     } 





    } 



}); 




} 


//define your custom adapter 



private static String convertStreamToString(InputStream is) 
{ 


BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
StringBuilder sb = new StringBuilder(); 
String line = null; 
try 
{ 

while ((line = reader.readLine()) != null) { 
    sb.append(line + "\n"); 
} 
}catch(IOException e) 
{ 

} 
finally 
{ 
    try{ 
     is.close(); 
    }catch(IOException e) 
    { 

    } 
    }return sb.toString(); 



} 



    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.activity_main_actions, menu); 



     return super.onCreateOptionsMenu(menu); 
    } 

    /** 
    * On selecting action bar icons 
    * */ 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Take appropriate action for each action item click 
     switch (item.getItemId()) { 

     case R.id.action_refresh: 
      // refresh 
      refreshMenuItem = item; 

      new ProgressTask().execute(); 
      return true; 

     default: 
      return super.onOptionsItemSelected(item); 
     } 
    } 

    /** 
    * Launching new activity 
    * */ 


    /* 
    * Actionbar navigation item select listener 
    */ 
    @Override 
    public boolean onNavigationItemSelected(int itemPosition, long itemId) { 
     // Action to be taken after selecting a spinner item 
     return false; 
    } 





    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) 
    private void forceRTLIfSupported() 
    { 
     if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){ 
      getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL); 
     } 
    } 


    protected void onPostExecute(Object result) { 
     try { 
      if ((this.pd != null) && this.pd.isShowing()) { 
       this.pd.dismiss(); 
      } 
     } catch (final IllegalArgumentException e) { 
      // Handle or log or ignore 
     } catch (final Exception e) { 
      // Handle or log or ignore 
     } finally { 
      this.pd = null; 
     } 
    } 


    private class ProgressTask extends AsyncTask <Void,Void,Void> 
    { 

     @Override 
     protected void onPreExecute() 
     { 
      refreshMenuItem.setActionView(R.layout.action_progressbar); 
      refreshMenuItem.expandActionView(); 

     } 

     @Override 
     protected Void doInBackground(Void... params) 
     { 

      ConnectivityManager cm =(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
      if (netInfo != null && netInfo.isConnectedOrConnecting()) 
      { 
       internet="yes"; 
      StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
      StrictMode.setThreadPolicy(policy); 


      //httpclient = new DefaultHttpClient(); 
      httpclient = new DefaultHttpClient(); 
      String type2="moonwalker"; 
      httppost = new HttpPost("http://mypage.com/myfolder/mypage.php?Username="+type2+""); 
     try 
      { 
      nameValuePairs = new ArrayList<NameValuePair>(); 
      nameValuePairs.add(new BasicNameValuePair("Type",type)); 
      nameValuePairs.add(new BasicNameValuePair("Date",date)); 
      nameValuePairs.add(new BasicNameValuePair("Title",title)); 
      nameValuePairs.add(new BasicNameValuePair("Content",content)); 
      nameValuePairs.add(new BasicNameValuePair("Time",time)); 
// 
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,"UTF-8")); 
      response = httpclient.execute(httppost); 
// 
// 
// 
      if(response.getStatusLine().getStatusCode()==200) 
      { 
// 
      entity=response.getEntity(); 
      if(entity !=null) 
      { 
       InputStream instream=entity.getContent(); 
      try { 
      JSONArray jArray = new JSONArray(convertStreamToString(instream)); 
arr=jArray; 
     // int jArrayLength = arr.length(); 
      postsinarray = new String[arr.length()]; 
      arrayinlist=new String[arr.length()]; 



      }catch(JSONException e){ 
// 
      }}} 
     }//End of first try 
// 
      catch(Exception e) 
      { 

      } 

//     
        Category task_data[] = new Category[arr.length()]; 

         titlearray=new String[arr.length()]; 
        contentarray=new String[arr.length()]; 
        datearray=new String[arr.length()]; 
        task_type=new String[arr.length()]; 
        task_id=new String[arr.length()]; 
        deleted_task=new String[arr.length()]; 
//     
        for(int i =0; i<arr.length(); i++){ 
try 
{ 
        JSONObject json_data = arr.getJSONObject(i); 



       String postcontent=URLDecoder.decode(json_data.getString("Content"), "UTF-8"); 
       wholepost= wholepost+postcontent+"\t\t\t\t"; 

       contentarray[i]=postcontent; 
//     
       if(postcontent.length()>64) 
       { 
        String subpost=postcontent.substring(0,50); 
        String newcontent=subpost+"..."; 
        nc=newcontent; 

       } 
       else 
       { 
        nc=postcontent; 
       } 

       String posttype=json_data.getString("Type"); 

       task_type[i]=posttype; 
       StrictMode.ThreadPolicy policy2 = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
       StrictMode.setThreadPolicy(policy); 
//     
       URL newurl = new URL("http://mypage.com/myfolder/photos/mini_"+posttype+".jpg"); 
       Bitmap mIcon_val = BitmapFactory.decodeStream(newurl.openConnection() .getInputStream()); 

       task_data[i]=new Category(mIcon_val, json_data.getString("Title"),nc,json_data.getString("Date"),json_data.getString("Taskid")); 
       titlearray[i]=json_data.getString("Title"); 
       datearray[i]=json_data.getString("Date"); 

       task_id[i]=json_data.getString("Taskid"); 




    adapter = new CategoryAdapter(News.this, R.layout.list_row, task_data); 

// 
} 
     catch(Exception ex) 
     { 
      Toast.makeText(getBaseContext(), ex.toString(), Toast.LENGTH_LONG).show(); 
      } 
       } 
     } 
     else 
     {internet="non"; 
      //Toast.makeText(getBaseContext(),"No internet connection", Toast.LENGTH_LONG).show(); 
     } 
     return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) 
     { 
      if(internet.equals("yes")) 
      { 
       listView1 = (ListView)findViewById(android.R.id.list); 

       listView1.setAdapter(adapter); 


       adapter.notifyDataSetChanged(); 
      } 
      else 
      { 
       Toast.makeText(getBaseContext(),"No internet connection", Toast.LENGTH_LONG).show(); 
      } 



//   scrolltext.setText(wholepost); 

      refreshMenuItem.collapseActionView(); 
      // remove the progress bar view 
      refreshMenuItem.setActionView(null); 
      //Toast.makeText(getBaseContext(),message, Toast.LENGTH_LONG).show(); 

     } 

    } 

} 

如果我打开拳头时间的应用程序,它崩溃,并给了我以下错误:

10-28 09:09:28.680: E/AndroidRuntime(2840): FATAL EXCEPTION: main 
10-28 09:09:28.680: E/AndroidRuntime(2840): java.lang.NullPointerException 
10-28 09:09:28.680: E/AndroidRuntime(2840):  at info.androidhive.actionbar.News$1$1.run(News.java:283) 
10-28 09:09:28.680: E/AndroidRuntime(2840):  at android.os.Handler.handleCallback(Handler.java:725) 
10-28 09:09:28.680: E/AndroidRuntime(2840):  at android.os.Handler.dispatchMessage(Handler.java:92) 
10-28 09:09:28.680: E/AndroidRuntime(2840):  at android.os.Looper.loop(Looper.java:137) 
10-28 09:09:28.680: E/AndroidRuntime(2840):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
10-28 09:09:28.680: E/AndroidRuntime(2840):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-28 09:09:28.680: E/AndroidRuntime(2840):  at java.lang.reflect.Method.invoke(Method.java:511) 
10-28 09:09:28.680: E/AndroidRuntime(2840):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
10-28 09:09:28.680: E/AndroidRuntime(2840):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
10-28 09:09:28.680: E/AndroidRuntime(2840):  at dalvik.system.NativeStart.main(Native Method) 

当我打开它,它工作正常崩溃后,立即如果我等待约20分钟,然后尝试再次打开它,它会崩溃,并且同样的过程重演,任何人都有我关于发生了什么?

+0

可以请你指出线283 – Toppers 2014-10-28 07:29:33

+0

使用的AsyncTask为什么使用线程加载新 – 2014-10-28 07:29:37

+0

:适配器.notifyDataSetChanged(); – 2014-10-28 07:30:10

回答

0

您的变量“adapter”正在抛出nullpointerexception ...尝试处理execption ...这可能是由于“adapter”语句的初始化未执行......因为您已将该代码放入

if(response.getStatusLine().getStatusCode()==200) 

...,我认为这个条件没有运行..

+0

我用asynctask代替线程,问题保持不变(适配器),请帮忙吗? – 2014-10-28 12:37:10

+0

@MoonzerYaghi没有天气使用Asynctask或线程的差异...这里的问题是(我认为是)你“如果”语句不执行...因此你的变量“适配器”没有初始化,因此null指针异常抛出系统 – 2014-10-28 12:42:03

+0

行,你能帮我或建议我做任何事吗? – 2014-10-28 12:59:43