我的应用在启动后立即崩溃。我不知道为什么。我在此应用程序中遇到其他问题,这些问题已在另一个线程中解决,但是,我现在遇到的问题完全不同。我知道我的代码/结构不是最优雅,但是在涉及Android和XML时我仍然是一个新手。

这是日志错误stacktrace:

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 hidden 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));
}
}

最佳答案

移动这个

TableLayout tl=(TableLayout)findViewById(R.id.db_data);

onCreate(),因为在调用setContentView()之前必须先findViewById

09-25 21:05