多态性 - 主要活动 - 引用null对象

时间:2014-04-25 12:50:50

标签: java android

我使用接口实现了多态,用于调用main活动的函数,但在调用或传递引用期间,它变为null。请帮帮我,我该怎么办?

+ 我在主要活动的onCreate方法中创建了第二个类的对象:

public class PlayerAudioActivity extends Activity implements Listenercalling{

      public void onCreate(Bundle savedInstanceState)
      {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_player_audio);
          MyReceiver mReciever = new MyReceiver();
          mReciever.setMyInterface(PlayerAudioActivity.this);
      }

     public void getplay()
     {
         Log.d("yeppppppppppppppppp", "jsdhijdiowejd");
         if(mp.isPlaying())
            { 
                if(mp!=null)
                {
                    mp.pause();
                    btnplay.setImageResource(R.drawable.btn_play);
                }
            }
            else
            {
                if(mp!=null)
                {
                    mp.start();
                    btnplay.setImageResource(R.drawable.btn_pause);
                }

            }


     }
}

+ 我的界面:

package com.Audio.audioplayer;

import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.SeekBar;

public interface Listenercalling {
     public void getplay();
}

+ 我的第二堂课:

public class MyReceiver extends BroadcastReceiver implements  Listenercalling{
    private Listenercalling ls;
    private static final String TAG = "waaaawoooooooooOOOOOOjnjkhdfku";
    public void onReceive(Context context, Intent intent) {
        //btnplay=(ImageButton)btnplay;
         final String action=intent.getAction();
         if(action=="btnplay")
         {

             getplay();
             Log.d(TAG, ""+action);

         }
}
public void setMyInterface(PlayerAudioActivity pl)
    {
        Log.d("wawwwooo"+pl, "lfkero");
        ls=pl;


    }
@Override
public void getplay() {
        Log.d("wawwwooo", "getplayreciever calling");
        ls=new PlayerAudioActivity();   
        ls.getplay();   
    }
}

+ 错误:

04-25 18:08:25.805: E/AndroidRuntime(30100): FATAL EXCEPTION: main
04-25 18:08:25.805: E/AndroidRuntime(30100): java.lang.RuntimeException: Unable to start receiver com.Audio.audioplayer.MyReceiver: java.lang.NullPointerException
04-25 18:08:25.805: E/AndroidRuntime(30100):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2520)
04-25 18:08:25.805: E/AndroidRuntime(30100):    at android.app.ActivityThread.access$1500(ActivityThread.java:156)
04-25 18:08:25.805: E/AndroidRuntime(30100):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1416)
04-25 18:08:25.805: E/AndroidRuntime(30100):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-25 18:08:25.805: E/AndroidRuntime(30100):    at android.os.Looper.loop(Looper.java:153)
04-25 18:08:25.805: E/AndroidRuntime(30100):    at android.app.ActivityThread.main(ActivityThread.java:5299)
04-25 18:08:25.805: E/AndroidRuntime(30100):    at java.lang.reflect.Method.invokeNative(Native Method)
04-25 18:08:25.805: E/AndroidRuntime(30100):    at java.lang.reflect.Method.invoke(Method.java:511)
04-25 18:08:25.805: E/AndroidRuntime(30100):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
04-25 18:08:25.805: E/AndroidRuntime(30100):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
04-25 18:08:25.805: E/AndroidRuntime(30100):    at dalvik.system.NativeStart.main(Native Method)
04-25 18:08:25.805: E/AndroidRuntime(30100): Caused by: java.lang.NullPointerException
04-25 18:08:25.805: E/AndroidRuntime(30100):    at com.Audio.audioplayer.PlayerAudioActivity.getplay(PlayerAudioActivity.java:414)
04-25 18:08:25.805: E/AndroidRuntime(30100):    at com.Audio.audioplayer.MyReceiver.getplay(MyReceiver.java:138)
04-25 18:08:25.805: E/AndroidRuntime(30100):    at com.Audio.audioplayer.MyReceiver.onReceive(MyReceiver.java:28)
04-25 18:08:25.805: E/AndroidRuntime(30100):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2513)
04-25 18:08:25.805: E/AndroidRuntime(30100):    ... 10 more

1 个答案:

答案 0 :(得分:0)

乍一看,我发现代码存在两个问题。

  1. 变量mp不是成员变量,也不会传递给您的getPlay()方法;
  2. 你编写代码的方式并没有多大意义。您检查mp.isPlaying()是否然后检查它是否与null不同。更好的是。

    public void getPlay() {
        if (mp != null) {
            if (mp.isPlaying() {
                mp.pause();
                btnplay.setImageResource(R.drawable.btn_play);
            } else {
                mp.start();
                btnplay.setImageResource(R.drawable.btn_pause);
            } 
        } 
    } 
    
  3. 据我所知,NullPointerException可能已经消失,但我认为它还不能正常工作,因为您仍然需要初始化mp变量。