0

尝试访问远程数据库时遇到问题。此问题仅在 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));
}

}

4

2 回答 2

2

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

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

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

于 2012-11-30T19:04:03.790 回答
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);
    }

}
于 2012-11-30T20:21:13.417 回答