在Android上制作吐司的例外

时间:2015-01-17 21:07:41

标签: android json toast

我在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();
    }

但它也行不通。

请告诉我哪里错了, 感谢。

3 个答案:

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