在 android 中烤面包时出现异常
exception on making toast in android
我正在 android 中实现一个代码,将 json 数据发送到 server.I 我指的是以下 link 的教程:-
sending json to server.
几乎所有的代码都工作正常,即当我的代码到达 onPostExecute() 方法时,我从 server.But 得到响应我得到以下异常:
01-18 02:20:40.485 435-435/com.example.sagar.postjson W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x4001d800)
01-18 02:20:40.505 435-435/com.example.sagar.postjson E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
at android.widget.Toast.<init>(Toast.java:89)
at android.widget.Toast.makeText(Toast.java:231)
at com.example.sagar.postjson.HttpAsyncTask.onPostExecute(HttpAsyncTask.java:119)
at com.example.sagar.postjson.HttpAsyncTask.onPostExecute(HttpAsyncTask.java:26)
at android.os.AsyncTask.finish(AsyncTask.java:417)
at android.os.AsyncTask.access0(AsyncTask.java:127)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
该方法的代码如下:
protected void onPostExecute(String result) {
Toast.makeText(new MainActivity().getBaseContext(), "come", Toast.LENGTH_LONG).show();
}
我也试过这种方式:-
protected void onPostExecute(String result) {
new MainActivity().print();
}
MainActivity 中的 print() 方法为:
public void print(String result) {
Toast.makeText(getBaseContext(), "come", Toast.LENGTH_LONG).show();
}
但是还是不行。
请告诉我哪里错了,
谢谢。
将您的 Toast
更改为...
Toast.makeText(MainActivity().getActivity(), "come", Toast.LENGTH_LONG).show();
而不是...
Toast.makeText(new MainActivity().getBaseContext(), "come", Toast.LENGTH_LONG).show();
您不需要创建新的 Activity
,仅引用当前 Activity
的 Context
。
我认为问题出在这段代码上:
new MainActivity().getBaseContext()
这不是获取上下文的方法。您需要将其更改为 MainActivity.this 然后它将起作用(这也取决于当前情况,我不知道您的情况)。
No , i have defined in the same package as MainActivity but didn't
made it inner class.
因为你的 AsyncTask 是分开的 class 它对你的 Activity class 一无所知 .您需要通过构造函数传递上下文:
public MyTask(final Context context) {
this.mContext = context;
}
通常我会通过实现 util 方法来显示 toast 消息:
public static void showMessage(final String msg) {
final Context context = App.getContext();
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
}
其中应用程序是从应用程序扩展的自定义 class,它可能像:
public class App extends Application {
private static Context sContext;
public void onCreate() {
sContext = getApplicationContext();
}
public static Context getContext() {
return sContext;
}
}
我认为这是更好的方法,也是更干净的解决方案,因为您可以在应用程序的任何地方调用它而无需冗余调用。
在ClassContext mcontext;
中定义一个全局变量
然后,在oncreate()
初始化变量mcontext= getActivity().getApplicationContext()
。
然后,使用 class 中的上下文。
Toast.makeText(mcontext, "come", Toast.LENGTH_LONG).show();
我正在 android 中实现一个代码,将 json 数据发送到 server.I 我指的是以下 link 的教程:- sending json to server.
几乎所有的代码都工作正常,即当我的代码到达 onPostExecute() 方法时,我从 server.But 得到响应我得到以下异常:
01-18 02:20:40.485 435-435/com.example.sagar.postjson W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x4001d800)
01-18 02:20:40.505 435-435/com.example.sagar.postjson E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
at android.widget.Toast.<init>(Toast.java:89)
at android.widget.Toast.makeText(Toast.java:231)
at com.example.sagar.postjson.HttpAsyncTask.onPostExecute(HttpAsyncTask.java:119)
at com.example.sagar.postjson.HttpAsyncTask.onPostExecute(HttpAsyncTask.java:26)
at android.os.AsyncTask.finish(AsyncTask.java:417)
at android.os.AsyncTask.access0(AsyncTask.java:127)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
该方法的代码如下:
protected void onPostExecute(String result) {
Toast.makeText(new MainActivity().getBaseContext(), "come", Toast.LENGTH_LONG).show();
}
我也试过这种方式:-
protected void onPostExecute(String result) {
new MainActivity().print();
}
MainActivity 中的 print() 方法为:
public void print(String result) {
Toast.makeText(getBaseContext(), "come", Toast.LENGTH_LONG).show();
}
但是还是不行。
请告诉我哪里错了, 谢谢。
将您的 Toast
更改为...
Toast.makeText(MainActivity().getActivity(), "come", Toast.LENGTH_LONG).show();
而不是...
Toast.makeText(new MainActivity().getBaseContext(), "come", Toast.LENGTH_LONG).show();
您不需要创建新的 Activity
,仅引用当前 Activity
的 Context
。
我认为问题出在这段代码上:
new MainActivity().getBaseContext()
这不是获取上下文的方法。您需要将其更改为 MainActivity.this 然后它将起作用(这也取决于当前情况,我不知道您的情况)。
No , i have defined in the same package as MainActivity but didn't made it inner class.
因为你的 AsyncTask 是分开的 class 它对你的 Activity class 一无所知 .您需要通过构造函数传递上下文:
public MyTask(final Context context) {
this.mContext = context;
}
通常我会通过实现 util 方法来显示 toast 消息:
public static void showMessage(final String msg) {
final Context context = App.getContext();
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
}
其中应用程序是从应用程序扩展的自定义 class,它可能像:
public class App extends Application {
private static Context sContext;
public void onCreate() {
sContext = getApplicationContext();
}
public static Context getContext() {
return sContext;
}
}
我认为这是更好的方法,也是更干净的解决方案,因为您可以在应用程序的任何地方调用它而无需冗余调用。
在ClassContext mcontext;
然后,在oncreate()
初始化变量mcontext= getActivity().getApplicationContext()
。
然后,使用 class 中的上下文。
Toast.makeText(mcontext, "come", Toast.LENGTH_LONG).show();