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