我在android中实现了一个将json数据发送到server的代码。我指的是以下链接的教程: - sending json to server.
几乎所有代码都运行良好,即我从服务器获得响应。但是当我的代码到达 onPostExecute()方法时,我得到以下异常:
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.access$300(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();
}
但它也行不通。
请告诉我哪里错了, 感谢。
答案 0 :(得分:2)
将您的Toast
更改为...
Toast.makeText(MainActivity().getActivity(), "come", Toast.LENGTH_LONG).show();
而不是......
Toast.makeText(new MainActivity().getBaseContext(), "come", Toast.LENGTH_LONG).show();
您无需创建新的Activity
,只能引用当前Context
的{{1}}。
答案 1 :(得分:1)
我认为问题在于这段代码:
new MainActivity().getBaseContext()
这不是获取上下文的方法。您需要将其更改为 MainActivity.this ,然后它才会起作用(这取决于当前的情况,我也不了解您的情况)。
不,我在与MainActivity相同的包中定义但没有 使它成为内在阶级。
由于您的 AsyncTask 是分离的类,因此它对您的Activity类一无所知。您需要通过构造函数传递Context:
public MyTask(final Context context) {
this.mContext = context;
}
通常我通过实现将为我做的实用方法来显示toast消息:
public static void showMessage(final String msg) {
final Context context = App.getContext();
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
}
其中App是从Application扩展的自定义类,它可能像:
public class App extends Application {
private static Context sContext;
public void onCreate() {
sContext = getApplicationContext();
}
public static Context getContext() {
return sContext;
}
}
我认为这是更好的方法,而且它是更干净的解决方案,因为您可以在应用程序的任何地方调用它而无需冗余调用。
答案 2 :(得分:0)
在班级Context mcontext;
然后,在oncreate()
初始化变量mcontext= getActivity().getApplicationContext()
。
然后,使用该类中的上下文。
Toast.makeText(mcontext, "come", Toast.LENGTH_LONG).show();