起動するとすぐにアプリがクラッシュします。理由がわかりません。このアプリで別のスレッドで解決された他の問題が発生していましたが、現在発生している問題は完全に異なります。私のコード/構造は最もエレガントではないことは知っていますが、AndroidとXMLに関してはまだ初心者です。
ログエラーのスタックトレースは次のとおりです。
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));
}
}