2013-11-26 153 views
0

我被困在試圖從另一個類調用方法的問題上(當我從這個類中調用一個方法時,我得到了一個N​​ullPointerException異常,除非它是靜態函數。 render.Update(),並得到一個logcat的輸出 - >http://pastebin.com/njjxDiQZAndroid - 空指針異常

11-26 17:14:40.532: E/MediaPlayer(29755): Should have subtitle controller already set 
11-26 17:14:40.752: E/AndroidRuntime(29755): FATAL EXCEPTION: main 
11-26 17:14:40.752: E/AndroidRuntime(29755): Process: com.coursework.courseworkapp, PID: 29755 
11-26 17:14:40.752: E/AndroidRuntime(29755): java.lang.NullPointerException 
11-26 17:14:40.752: E/AndroidRuntime(29755): at com.coursework.courseworkapp.Visual.updateVisualizer(Visual.java:73) 
11-26 17:14:40.752: E/AndroidRuntime(29755): at com.coursework.courseworkapp.Visual$1.onWaveFormDataCapture(Visual.java:48) 
11-26 17:14:40.752: E/AndroidRuntime(29755): at android.media.audiofx.Visualizer$NativeEventHandler.handleCaptureMessage(Visualizer.java:669) 
11-26 17:14:40.752: E/AndroidRuntime(29755): at android.media.audiofx.Visualizer$NativeEventHandler.handleMessage(Visualizer.java:700) 
11-26 17:14:40.752: E/AndroidRuntime(29755): at android.os.Handler.dispatchMessage(Handler.java:102) 
11-26 17:14:40.752: E/AndroidRuntime(29755): at android.os.Looper.loop(Looper.java:137) 
11-26 17:14:40.752: E/AndroidRuntime(29755): at android.app.ActivityThread.main(ActivityThread.java:4998) 
11-26 17:14:40.752: E/AndroidRuntime(29755): at java.lang.reflect.Method.invokeNative(Native Method) 
11-26 17:14:40.752: E/AndroidRuntime(29755): at java.lang.reflect.Method.invoke(Method.java:515) 
11-26 17:14:40.752: E/AndroidRuntime(29755): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777) 
11-26 17:14:40.752: E/AndroidRuntime(29755): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593) 
11-26 17:14:40.752: E/AndroidRuntime(29755): at dalvik.system.NativeStart.main(Native Method) 

任何幫助,將不勝感激我真的難倒這裏

頭等艙

package com.coursework.courseworkapp; 

import java.util.Set; 

import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Matrix; 
import android.graphics.Paint; 
import android.graphics.Rect; 
import android.graphics.Bitmap.Config; 
import android.media.MediaPlayer; 
import android.media.audiofx.Visualizer; 
import android.util.Log; 
import android.view.View; 
import android.widget.LinearLayout; 

public class Visual{ 
byte[] fft; 
byte[] mFFTBytes; 
byte[] mBytes; 
private Visualizer mVisualizer; 
Render render; 
private Rect mRect = new Rect(); 

private Paint mFlashPaint = new Paint(); 
private Paint mFadePaint = new Paint(); 

Bitmap mCanvasBitmap; 
Canvas mCanvas; 



public int Test(MediaPlayer player){ 

    mVisualizer = new Visualizer(player.getAudioSessionId()); 
    mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]); 
    Visualizer.OnDataCaptureListener captureListener = new Visualizer.OnDataCaptureListener() 
    { 
     @Override 
     public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes, 
      int samplingRate) 
     { 
      updateVisualizer(bytes); 

     } 

     @Override 
     public void onFftDataCapture(Visualizer visualizer, byte[] bytes, 
      int samplingRate) 
     { 
     updateVisualizerFFT(bytes); 

     } 
    }; 

    mVisualizer.setDataCaptureListener(captureListener, Visualizer.getMaxCaptureRate()/2, true, true); 
    mVisualizer.setEnabled(true); 



    return player.getAudioSessionId(); 

} 

public void updateVisualizer(byte[] bytes) { 
     mBytes = bytes; 
    } 


public void updateVisualizerFFT(byte[] bytes) { 
    mFFTBytes = bytes; 
     render.Update(); 
     //render.invalidate()   
    } 

    public byte[] getFFT(){ 
     return mFFTBytes; 
    } 
} 

渲染類

package com.coursework.courseworkapp; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.media.audiofx.Visualizer; 
import android.util.Log; 
import android.view.View; 
import android.widget.Toast; 

public class Render extends View { 

public Render(Context context) { 
    super(context); 
    setMinimumWidth(800); 
    setMinimumHeight(1000); 
    setFocusable(true); 
} 

public void Update(){ 
    //Will have code here after fix crash. 

} 
protected void onDraw(Canvas canvas){   
    canvas.drawColor(Color.RED);   
    //Will add more code here. 
} 
} 

MainActivity.Java - 我該如何開始Visualise.java

public class MainActivity extends Activity { 

private MediaPlayer mPlayer; 
Visual visualize = new Visual(); 
Render render; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    render = new Render(this); 
    ((LinearLayout) findViewById(R.id.root)).addView(render, 0); 

    //Log.d("Freq", "test"); 
    mPlayer = MediaPlayer.create(this, R.raw.test2); 
    mPlayer.setLooping(true); 
    mPlayer.start(); 
    //Log.d("Freq", "test"); 
    Handler handler = new Handler(); 
    Runnable runnable = new Runnable(){ 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      int i = visualize.Test(mPlayer); 
      //render.invalidate(); 


     } 
    }; 
    handler.postDelayed(runnable, 100); 

    /*byte[] fft = visualize.getFFT(); 
    if(fft != null){ 
     Toast.makeText(this,"yey",Toast.LENGTH_LONG).show(); 
    } 
    else{ 
     Toast.makeText(this,"nope",Toast.LENGTH_LONG).show(); 

    }*/ 

    /* THis part didn't work, Why? Check the other example */ 
    //Log.w("Freq", String.valueOf(fft.length)); 
    /*for(int i = 0; i < fft.length; i++){ 
     String s = new String(); 
     Log.w("Freq", String.valueOf(fft[i])); 

    }*/ 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

public void tryDraw(){ 
    //render.Update(); 
} 

}

+0

閱讀在這裏發佈logcat的。 – khubaib

+0

IT似乎正在發生,因爲'bytes'爲空。 –

+0

什麼是73行'Visual.java'? – Raghunandan

回答

0

你的視覺類不會擴展Activtiy。但你有

render = new Render(this); 

this沒有引用活動上下文。

另外,你不是在任何佈局在視覺類會給你NullPointerException膨脹。

findViewById尋找與當前充氣佈局中提到的id的視圖。

+0

嗯,對不起,問這個,因爲我是相當新的Java編程但在理論上將「延伸活動」的視覺類應該與我的問題幫助嗎? 只是很快嘗試,我仍然留下了相同的崩潰,但不幸的是,我可能誤解了你的意思,或者有沒有辦法引用除此之外的上下文? – user3037567

+0

@ user3037567閱讀文檔 – Raghunandan

+0

基本上我同意。但是編譯器不應該檢測到這個錯誤嗎? –

0

您聲明Render render;但不要將其初始化 你可以做到這一點只有在渲染的靜態的,所以解決這個問題

VISUAL:

public class Visual { 

Context mContext; 

// constructor 
public Visual(Context context){ 
    this.mContext = context; 
    } 

.... 

public void updateVisualizerFFT(byte[] bytes) { 
    mFFTBytes = bytes; 
     //Don't forget to initialize redender 
     Render render = new Render(this.mContext); 
     render.Update(); 
     //render.invalidate()   
    } 
} 

渲染:

public class Render extends View { 

public Render(Context context) { 
    super(context); 
    setMinimumWidth(800); 
    setMinimumHeight(1000); 
    setFocusable(true); 
} 

} 

MainActivity :

你應該能夠運行

int i = visualize.Test(mPlayer); 

context