2012-12-01 80 views
0

我的應用在發佈後立即崩潰。我無法弄清楚爲什麼。我在另一個線程中解決了此應用程序的其他問題,但是現在我遇到的問題完全不同。我知道我的代碼/結構不是最優雅的,但在Android和XML方面我仍然是新手。發佈後立即崩潰 - 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 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)); 
} 
} 
+0

所以開始使用'xml'進行佈局。太好了! –

+0

有一天我肯定我會學習如何大聲笑。現在,這是我能做的最好的。 –

回答

2

移動這個

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

onCreate(),因爲你面前有setContentView()致電findViewById

+0

這就是我所做的。看到我貼出自己的答案。仍然必須命名'tl',它將在整個應用程序中共享,但是,我必須將初始化移動到onCreate –

+0

仍然將您的答案標記爲正確答案,因爲我無法將自己標記爲2天。 –

+0

如果你可以告訴我爲什麼上面的代碼沒有完成,那就太棒了。 I.E.目前我的數據庫中有超過55個條目,在我的應用程序中點擊刷新按鈕後,它會加載37個條目然後停止。沒有完成,並且從未更新總計(UIFinish()從不運行它似乎) –

1

這是我自己的錯誤。我正在初始化一個錯誤的地方桌面佈局。

TableLayout tl=(TableLayout)findViewById(R.id.db_data);應該是簡單TableLayout tl;然後初始化它的onCreate()