Android 由于数据连接不良,适配器中出现异常
只要有人打电话从MySQL数据库中获取数据,我的应用程序中就会出现一些类似下面的StackTrace。如果连接断开并且超时,我会得到以下跟踪: 例如:Android 由于数据连接不良,适配器中出现异常,android,nullpointerexception,android-adapter,Android,Nullpointerexception,Android Adapter,只要有人打电话从MySQL数据库中获取数据,我的应用程序中就会出现一些类似下面的StackTrace。如果连接断开并且超时,我会得到以下跟踪: 例如: java.lang.NullPointerException at android.widget.ArrayAdapter.init(ArrayAdapter.java:310) at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:128) at com.---.---.pr
java.lang.NullPointerException
at android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:128)
at com.---.---.profile.MyReviewAdapter.<init>(MyReviewAdapter.java:20)
at com.---.---.profile.UserFragmentActivity$CommentFragment$MyCommentTask.onPostExecute(UserFragmentActivity.java:559)
at com.---.---.profile.UserFragmentActivity$CommentFragment$MyCommentTask.onPostExecute(UserFragmentActivity.java:1)
at android.os.AsyncTask.finish(AsyncTask.java:631)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
java.lang.NullPointerException
at android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:128)
at com.---.---.master.TopItemAdapter.<init>(TopItemAdapter.java:18)
at com.---.---.master.MainFragmentActivity$TopFrag$TopTask.onPostExecute(MainFragmentActivity.java:961)
at com.---.---.master.MainFragmentActivity$TopFrag$TopTask.onPostExecute(MainFragmentActivity.java:1)
at android.os.AsyncTask.finish(AsyncTask.java:631)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
InputStream is = null;
InputStream is = new InputStream();
try {
JSONArray jArray = new JSONArray(result);
JSONObject json_data = null;
for (int i = 0; i < jArray.length(); i++) {
json_data = new JSONOBject(jArray.getJSONObject(i).toString());
item = json_data.getString("item");
cat = json_data.getString("category");
items.add(item);
cats.add(cat);
}
} catch (JSONException e1) {
} catch (ParseException e1) {
e1.printStackTrace();
}
不止一个对象初始化为null
编辑:
我认为问题在于:
try {
JSONArray jArray = new JSONArray(result);
JSONObject json_data = null;
for (int i = 0; i < jArray.length(); i++) {
json_data = jArray.getJSONObject(i);
item = json_data.getString("item");
cat = json_data.getString("category");
items.add(item);
cats.add(cat);
}
} catch (JSONException e1) {
} catch (ParseException e1) {
e1.printStackTrace();
}
试试看{
JSONArray jArray=新JSONArray(结果);
JSONObject json_data=null;
for(int i=0;i
这样做:
InputStream is = new InputStream();
try {
JSONArray jArray = new JSONArray(result);
JSONObject json_data = null;
for (int i = 0; i < jArray.length(); i++) {
json_data = new JSONOBject(jArray.getJSONObject(i).toString());
item = json_data.getString("item");
cat = json_data.getString("category");
items.add(item);
cats.add(cat);
}
} catch (JSONException e1) {
} catch (ParseException e1) {
e1.printStackTrace();
}
试试看{
JSONArray jArray=新JSONArray(结果);
JSONObject json_data=null;
for(int i=0;i
并捕获所有异常,不仅仅是JSONException和ParseException
InputStream is = null;
InputStream is = new InputStream();
try {
JSONArray jArray = new JSONArray(result);
JSONObject json_data = null;
for (int i = 0; i < jArray.length(); i++) {
json_data = new JSONOBject(jArray.getJSONObject(i).toString());
item = json_data.getString("item");
cat = json_data.getString("category");
items.add(item);
cats.add(cat);
}
} catch (JSONException e1) {
} catch (ParseException e1) {
e1.printStackTrace();
}
不止一个对象初始化为null
编辑:
我认为问题在于:
try {
JSONArray jArray = new JSONArray(result);
JSONObject json_data = null;
for (int i = 0; i < jArray.length(); i++) {
json_data = jArray.getJSONObject(i);
item = json_data.getString("item");
cat = json_data.getString("category");
items.add(item);
cats.add(cat);
}
} catch (JSONException e1) {
} catch (ParseException e1) {
e1.printStackTrace();
}
试试看{
JSONArray jArray=新JSONArray(结果);
JSONObject json_data=null;
for(int i=0;i
这样做:
InputStream is = new InputStream();
try {
JSONArray jArray = new JSONArray(result);
JSONObject json_data = null;
for (int i = 0; i < jArray.length(); i++) {
json_data = new JSONOBject(jArray.getJSONObject(i).toString());
item = json_data.getString("item");
cat = json_data.getString("category");
items.add(item);
cats.add(cat);
}
} catch (JSONException e1) {
} catch (ParseException e1) {
e1.printStackTrace();
}
试试看{
JSONArray jArray=新JSONArray(结果);
JSONObject json_data=null;
for(int i=0;i
并捕获所有异常,不仅仅是JSONException和ParseException。如果您主要关心的是强制关闭,并且您希望您的应用程序从不显示强制关闭,那么您可以使用UncaughtExceptionHandler
public class UncaughtExceptionHandler implements java.lang.Thread.UncaughtExceptionHandler
{
private final Context myContext;
public UncaughtExceptionHandler(Context context) {
myContext = context;
}
public void uncaughtException(Thread thread, Throwable exception) {
StringWriter stackTrace = new StringWriter();
exception.printStackTrace(new PrintWriter(stackTrace));
System.err.println(stackTrace);
Intent intent = new Intent(myContext, AnyActivity.class);
myContext.startActivity(intent);
Process.killProcess(Process.myPid());
System.exit(10);
}
}
在活动中的设置内容视图之前写下这一行
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler (this));
如果您主要关心的是强制关闭,并且您希望您的应用程序从不显示强制关闭,那么您可以使用UncaughtExceptionHandler
public class UncaughtExceptionHandler implements java.lang.Thread.UncaughtExceptionHandler
{
private final Context myContext;
public UncaughtExceptionHandler(Context context) {
myContext = context;
}
public void uncaughtException(Thread thread, Throwable exception) {
StringWriter stackTrace = new StringWriter();
exception.printStackTrace(new PrintWriter(stackTrace));
System.err.println(stackTrace);
Intent intent = new Intent(myContext, AnyActivity.class);
myContext.startActivity(intent);
Process.killProcess(Process.myPid());
System.exit(10);
}
}
在活动中的设置内容视图之前写下这一行
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler (this));
这个例外意味着什么
正如我在评论中所说的那样,NullPointerException
之所以没有出现,是因为数据库连接失败(在这种情况下,会发生另一个错误,而且会更快),它之所以出现,是因为您没有考虑安卓使用活动和片段的方式(更准确地说是它们的生命周期)
我不知道您是否有关于这些异常的额外详细信息,我猜当用户转到有问题的片段
看到进度对话框
(任务启动)然后旋转手机时,会出现异常。此时,Android将重新创建该活动以及包含该活动的任何片段。这应该由您的代码来处理,但是您做了一些特别糟糕的事情,这将抛出NullPointerException
看看您声明TopTask
类的方式,可以安全地说它是片段中的一个内部类。作为一个内部类意味着它与封闭的片段
实例有一个“连接”,允许它使用片段的方法(如getActivity()
)。因此,用户转到片段
,任务启动,然后旋转手机。此时将重新创建活动和片段,但您的任务(仍在运行)将保留对初始片段的特殊引用(该片段现在已死亡)。旋转后,此初始片段引用将与活动分离,其getActivity
方法将返回null
。将null
传递给ArrayAdapter
(在您的情况下,通过asuper
调用)将抛出您看到的异常(来自带有ICS
的设备)。传递给适配器的数组不能为null
,因为您在适配器初始化的正上方声明了它。这也会引发不同的异常
更重要的是,我如何防止这种情况?即使