在 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,仅引用当前 ActivityContext

我认为问题出在这段代码上:

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();