2013-11-26 3 views
0

Я застрял в проблеме, пытающейся вызвать метод из другого класса (когда когда-либо я вызываю метод из этого класса, я получаю сбой с помощью NullPointerException, кроме того, когда это статическая функция. render.Update() и получить выход LogCat из -.>http://pastebin.com/njjxDiQZAndroid - Null Pointer Exception

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

Кажется, что это происходит, поскольку 'bytes' являются нулевыми. –

+0

Что такое строка 73 'Visual.java' ?. – Raghunandan

ответ

0

Ваш визуальный класс не распространяется Activtiy. Но у вас есть

render = new Render(this); 

this не относится к деятельности контекста.

Также вы не будете раздувать какой-либо макет в визуальном классе ((LinearLayout) findViewById(R.id.root)).addView(render, 0); даст вам NullPointerException.

findViewById ищет вид с идентификатором, указанным в текущем раздутом макете.

+0

Хм, извините за это, поскольку я довольно новичок в программировании на Java, но теоретически добавление «extends Activity» в Visual Class должно помочь с моей проблемой? Просто быстро попробовал, и я до сих пор остался с таким же крахом, но, возможно, я неправильно понял, что вы имели в виду, или есть способ ссылаться на контекст, отличный от этого? – 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