ICS httppost NullPointerException

时间:2012-11-30 18:16:39

标签: android nullpointerexception http-post android-4.0-ice-cream-sandwich

尝试访问远程数据库时遇到问题。此问题仅发生在ICS或更高版本上,但在较旧的Android上运行完全正常。对于我的生活,我无法想象这一点,并且已经坚持了几个星期。我真的需要弄清楚这一点,然后我可以在我的另一个应用程序中使用这个解决方案,这个更重要。

非常感谢任何帮助。如果需要更多信息,请告诉我。

现在应用程序甚至无法启动,在启动时获得以下内容:

11-30 15:42:46.970: W/dalvikvm(10028): threadid=1: thread exiting with uncaught exception (group=0x40d04210)
11-30 15:42:46.970: E/AndroidRuntime(10028): FATAL EXCEPTION: main
11-30 15:42:46.970: E/AndroidRuntime(10028): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.defsoftsol.db.check/com.defsoftsol.db.check.MainActivity}: java.lang.NullPointerException
11-30 15:42:46.970: E/AndroidRuntime(10028):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1880)
11-30 15:42:46.970: E/AndroidRuntime(10028):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
11-30 15:42:46.970: E/AndroidRuntime(10028):    at android.app.ActivityThread.access$600(ActivityThread.java:123)
11-30 15:42:46.970: E/AndroidRuntime(10028):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
11-30 15:42:46.970: E/AndroidRuntime(10028):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-30 15:42:46.970: E/AndroidRuntime(10028):    at android.os.Looper.loop(Looper.java:137)
11-30 15:42:46.970: E/AndroidRuntime(10028):    at android.app.ActivityThread.main(ActivityThread.java:4428)
11-30 15:42:46.970: E/AndroidRuntime(10028):    at java.lang.reflect.Method.invokeNative(Native Method)
11-30 15:42:46.970: E/AndroidRuntime(10028):    at java.lang.reflect.Method.invoke(Method.java:511)
11-30 15:42:46.970: E/AndroidRuntime(10028):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
11-30 15:42:46.970: E/AndroidRuntime(10028):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
11-30 15:42:46.970: E/AndroidRuntime(10028):    at dalvik.system.NativeStart.main(Native Method)
11-30 15:42:46.970: E/AndroidRuntime(10028): Caused by: java.lang.NullPointerException
11-30 15:42:46.970: E/AndroidRuntime(10028):    at android.app.Activity.findViewById(Activity.java:1794)
11-30 15:42:46.970: E/AndroidRuntime(10028):    at com.defsoftsol.db.check.MainActivity.<init>(MainActivity.java:43)
11-30 15:42:46.970: E/AndroidRuntime(10028):    at java.lang.Class.newInstanceImpl(Native Method)
11-30 15:42:46.970: E/AndroidRuntime(10028):    at java.lang.Class.newInstance(Class.java:1319)
11-30 15:42:46.970: E/AndroidRuntime(10028):    at android.app.Instrumentation.newActivity(Instrumentation.java:1023)
11-30 15:42:46.970: E/AndroidRuntime(10028):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1871)
11-30 15:42:46.970: E/AndroidRuntime(10028):    ... 11 more

更新代码:(现在是整个应用程序的代码)

public class MainActivity extends Activity {

String deviceID="",dateStamp="",buff="",db_id="",db_device_id="",db_install_date="";       
byte[] data;    
HttpPost httppost;    
StringBuffer buffer;    
HttpResponse response;    
HttpClient httpclient;    
InputStream inputStream;    
List<NameValuePair> nameValuePairs;
int ID,activeinstalls;
long diff;
TableLayout tl=(TableLayout)findViewById(R.id.db_data);

public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button refresh = (Button)findViewById(R.id.btnrefresh);
    refresh.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            new MyAsyncTask(MainActivity.this).execute();

        }
    });
}

@SuppressWarnings("unused") 
public class MyAsyncTask extends AsyncTask<Void, Void, Void> 
{ 

    ProgressDialog mProgressDialog;
    private Context context;

    public MyAsyncTask(Context context) { 
        this.context = context;
    }

    @Override
    protected void onPostExecute(Void result) {
        mProgressDialog.dismiss();
    } 

    @Override 
    protected void onPreExecute() {
        mProgressDialog = ProgressDialog.show(MainActivity.this, "Loading...", "Data is Loading..."); 
    } 

    @Override
    protected Void doInBackground(Void... params) {
        update(); 
        return null; 
    }
}

private final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
private final long ONE_DAY = 24 * 60 * 60 * 1000;

@SuppressWarnings("unused")
public void update()
{
    int activeinstalls = 0;
    Date now = new Date();
    dateStamp = formatter.format(now);

    runOnUiThread(new Runnable(){ 
        @Override 
        public void run(){ 
            UISetup();
        }
    });

    ID = 1;
    try
    {
        do
        {
            try 
            {                    
                httpclient = new DefaultHttpClient();                    
                httppost = new HttpPost("http://#.#.#.#/***.php"); //Address cut for server security                    

                nameValuePairs = new ArrayList<NameValuePair>(1);                   
                nameValuePairs.add(new BasicNameValuePair("_id", String.valueOf(ID)));                    
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                response = httpclient.execute(httppost);                    
                inputStream = response.getEntity().getContent();                     
                data = new byte[256];                     
                buffer = new StringBuffer();                    
                int len = 0;                    
                while (-1 != (len = inputStream.read(data)) )                    
                {                        
                    buffer.append(new String(data, 0, len));                    
                }
                inputStream.close();
            } catch (Exception e) {                    
                Toast.makeText(MainActivity.this, "error"+e.toString(), Toast.LENGTH_LONG).show();                
                e.printStackTrace();
            }

            if(buffer.charAt(0)=='Y')
            {
                ID++;
                buff = buffer.toString();
                db_id = buff.substring(1, buff.indexOf("."));
                db_device_id = buff.substring(buff.indexOf(".")+1, buff.indexOf(","));
                db_install_date = buff.substring(buff.indexOf(",")+1, buff.length());

                Date before = null;
                try {
                    before = (Date)formatter.parse(db_install_date);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                diff = now.getTime() - before.getTime(); 

                runOnUiThread(new Runnable(){ 
                    @Override 
                    public void run(){ 
                        UIAdd(diff,db_id,db_device_id,db_install_date);
                    }
                });

            } else { //IF buffer returns N
                //  TODO: Fill in
            }
        } while(buffer.charAt(0)=='Y');

        UIFinish();

    } catch(Exception err) {
        err.printStackTrace();
    }
}
@SuppressWarnings("deprecation")
public void UISetup()
{
    tl.removeAllViews();
    dbline();
    TableRow titr = new TableRow(this); 
    titr.setLayoutParams(new LayoutParams( LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT)); 
    TextView dbid0 = new TextView(this); 
    TextView dbdevid0 = new TextView(this);
    TextView dbindate0 = new TextView(this);
    dbid0.setText("|   " + "_id");
    dbdevid0.setText("|   " + "device_id");
    dbindate0.setText("|   "+ "install_date"+"    |");

    titr.addView(dbid0); 
    titr.addView(dbdevid0);
    titr.addView(dbindate0);
    tl.addView(titr, new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
    dbline();
}
@SuppressWarnings("deprecation")
public void UIAdd(long diffr, String dbidn,String did,String idate)
{
    long days;
    days = diffr / ONE_DAY;
    TableRow tr = new TableRow(this); 
    tr.setLayoutParams(new LayoutParams( LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT)); 
    TextView dbid = new TextView(this); 
    TextView dbdevid = new TextView(this);
    TextView dbindate = new TextView(this);
    dbid.setText("|   " + dbidn);
    dbdevid.setText("|   " + did);
    dbindate.setText("|   " + idate+"   |");

    if(days <= 7)
    {
        activeinstalls++;
        if(days <= 3) 
        {
            dbid.setTextColor(Color.GREEN); 
            dbdevid.setTextColor(Color.GREEN);
            dbindate.setTextColor(Color.GREEN);
        } else {
            dbid.setTextColor(Color.MAGENTA);
            dbdevid.setTextColor(Color.MAGENTA);
            dbindate.setTextColor(Color.MAGENTA);
        }

    } else {
        dbid.setTextColor(Color.RED); 
        dbdevid.setTextColor(Color.RED);
        dbindate.setTextColor(Color.RED);
    }

    tr.addView(dbid); 
    tr.addView(dbdevid);
    tr.addView(dbindate);
    tl.addView(tr, new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
}
public void UIFinish()
{
    dbline();

    TextView te = (TextView)findViewById(R.id.totalentries);
    te.setText(String.valueOf(ID-1));
    TextView au = (TextView)findViewById(R.id.activeusers);
    au.setText(String.valueOf(activeinstalls));
}
@SuppressWarnings("deprecation")
public void dbline()
{
    TableLayout tl=(TableLayout)findViewById(R.id.db_data);
    TableRow tr = new TableRow(this); 
    tr.setLayoutParams(new LayoutParams( LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT)); 
    TextView dbid = new TextView(this); 
    TextView dbdevid = new TextView(this);
    TextView dbindate = new TextView(this);
    dbid.setText("+---------");
    dbdevid.setText("+-------------------------------");
    dbindate.setText("+--------------------+");

    tr.addView(dbid); 
    tr.addView(dbdevid);
    tr.addView(dbindate);
    tl.addView(tr, new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
}

}

2 个答案:

答案 0 :(得分:2)

您在try块中遇到异常,并且不初始化缓冲区。这就是你获得Null指针的原因。

你应该把所有东西放在try-catch中。或者更好地考虑如何处理它。

而且,您还应该从控制台中的try catch输出错误。并向我们​​展示。我们可以看一下。

答案 1 :(得分:0)

尝试使结构像这样

public class MyAsyncTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub
        // Do network oprations here
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        // Update UI here
        super.onPostExecute(result);
    }

}