私はandroidstudioでアプリ開発を行っています。
Macからandroidへソケット通信を用いて下のコードにより獲得することができますがそのコードにあるString line;をこの関数の外で(他クラスで)使えるようにするにはどうしたらいいのでしょうか?
ちなみにこのコードはMainActivityの@Override onCreateの中にあり,String line;を使いたいのは他クラスに書いている@Override onDrawFrameです。
#MainActivity.java
java
1public class MainActivity extends Activity { 2 private MyGLSurfaceView glView; 3 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 glView=new MyGLSurfaceView(this); 8 setContentView(glView); 9 } 10 11 @Override 12 public void onResume() { 13 //中略 14 } 15 @Override 16 public void onPause() { 17 //中略 18 } 19 20}
#MyGLSurfaceView.java
java
1public class MyGLSurfaceView extends GLSurfaceView { 2 private final Context mContext; 3 public GLRenderer renderer; 4 private static final String TAG = "MyGLSurfaceView"; 5 6 7 public MyGLSurfaceView(Context context) { 8 super(context); 9 mContext=context; 10 setEGLContextClientVersion(2); 11 setEGLConfigChooser(8, 8, 8, 8, 16, 0); 12 renderer = new GLRenderer(context); 13 setRenderer(renderer); 14 } 15}
#GLRenderer.java
java
1import android.content.Context; 2import android.opengl.GLES20; 3import android.opengl.GLSurfaceView; 4import android.opengl.Matrix; 5import android.os.AsyncTask; 6 7import java.io.BufferedReader; 8import java.io.IOException; 9import java.io.InputStreamReader; 10import java.net.Socket; 11import java.nio.FloatBuffer; 12import javax.microedition.khronos.egl.EGLConfig; 13import javax.microedition.khronos.opengles.GL10; 14 15 16 17public class GLRenderer implements GLSurfaceView.Renderer { 18 19 private String line = "0"; 20 21 private Object sync = new Object(); 22 //システム 23 private final Context mContext; 24 private boolean validProgram=false; //シェーダプログラムが有効 25 private RotationSensor myRotationSensor=null; //加速度方位GPSセンサ 26 27 private float aspect;//アスペクト比 28 private float viewingangle = 45f; //視野角(画面長手方向に対応する視野角[deg]) 29 30 31 //光源の座標 x,y,z 32 private float[] LightPos={-10f,1.5f,20f,1f};//x,y,z,1 33 34 //変換マトリックス 35 private float[] pMatrix=new float[16]; //プロジェクション変換マトリックス 36 private float[] mMatrix=new float[16]; //モデル変換マトリックス 37 private float[] cMatrix=new float[16]; //カメラビュー変換マトリックス 38 39 40 private Sphere MySphere=new Sphere(40,20); 41 42 43 //シェーダのattribute属性の変数に値を設定していないと暴走するのでそのための準備 44 private static float[] DummyFloat= new float[1]; 45 private static final FloatBuffer DummyBuffer=BufferUtil.makeFloatBuffer(DummyFloat); 46 47 GLRenderer(final Context context) { 48 mContext = context; 49 connect(); 50 } 51 52 //サーフェイス生成時に呼ばれる 53 @Override 54 public void onSurfaceCreated(GL10 gl10,EGLConfig eglConfig) { 55 //プログラムの生成 56 validProgram = GLES.makeProgram(); 57 58 //頂点配列の有効化 59 GLES20.glEnableVertexAttribArray(GLES.positionHandle); 60 GLES20.glEnableVertexAttribArray(GLES.normalHandle); 61 GLES20.glEnableVertexAttribArray(GLES.texcoordHandle); 62 63 //デプスバッファの有効化 64 GLES20.glEnable(GLES20.GL_DEPTH_TEST); 65 66 // カリングの有効化 67 GLES20.glEnable(GLES20.GL_CULL_FACE); //裏面を表示しないチェックを行う 68 69 // 裏面を描画しない 70 GLES20.glFrontFace(GLES20.GL_CCW); //表面のvertexのindex番号はCCWで登録 71 GLES20.glCullFace(GLES20.GL_BACK); //裏面は表示しない 72 73 //光源色の指定 (r, g, b,a) 74 GLES20.glUniform4f(GLES.lightAmbientHandle, 0.15f, 0.15f, 0.15f, 1.0f); //周辺光 75 GLES20.glUniform4f(GLES.lightDiffuseHandle, 0.5f, 0.5f, 0.5f, 1.0f); //乱反射光 76 GLES20.glUniform4f(GLES.lightSpecularHandle, 0.9f, 0.9f, 0.9f, 1.0f); //鏡面反射光 77 78 //背景色の設定 79 GLES20.glClearColor(0f, 0f, 0f, 1.0f); 80 81 //テクスチャの有効化 82 GLES20.glEnable(GLES20.GL_TEXTURE_2D); 83 84 // 背景とのブレンド方法を設定します。 85 GLES20.glEnable(GLES20.GL_BLEND); 86 GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); // 単純なアルファブレンド 87 88 89 90 } 91 92 public void setRotationSensor(RotationSensor s) { 93 94 myRotationSensor=s; 95 } 96 97 public void connect() { 98 new AsyncTask<Void, String, String>() { 99 @Override 100 protected String doInBackground(Void... voids) { 101 try { 102 while (true) { 103 Socket socket = new Socket("アドレス", 4000); 104 BufferedReader reader = new BufferedReader( 105 new InputStreamReader(socket.getInputStream())); 106 107 String temp = reader.readLine(); 108 synchronized (sync) { // 別スレッドでlineを書き換えるので、synchronizedで同期を取る 109 line = temp; 110 } 111 112 reader.close(); 113 socket.close(); 114 115 //return temp; 116 } 117 } catch (IOException e) { 118 e.printStackTrace(); 119 } 120 121 122 return null; 123 } 124 }.execute(); 125 } 126 127 //画面サイズ変更時に呼ばれる 128 @Override 129 public void onSurfaceChanged(GL10 gl10,int w,int h) { 130 //ビューポート変換 131 GLES20.glViewport(0,0,w,h); 132 aspect=(float)w/(float)h; 133 } 134 135 //毎フレーム描画時に呼ばれる 136 @Override 137 public void onDrawFrame(GL10 glUnused) { 138 if (!validProgram) return; 139 //シェーダのattribute属性の変数に値を設定していないと暴走するのでここでセットしておく。この位置でないといけない 140 GLES20.glVertexAttribPointer(GLES.positionHandle, 3, GLES20.GL_FLOAT, false, 0, DummyBuffer); 141 GLES20.glVertexAttribPointer(GLES.normalHandle, 3, GLES20.GL_FLOAT, false, 0, DummyBuffer); 142 GLES20.glVertexAttribPointer(GLES.texcoordHandle, 2, GLES20.GL_FLOAT, false, 0, DummyBuffer); 143 144 GLES.disableTexture(); //テクスチャ機能を無効にする。(デフォルト) 145 GLES.enableShading(); //シェーディング機能を有効にする。(デフォルト) 146 147 //画面のクリア 148 GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | 149 GLES20.GL_DEPTH_BUFFER_BIT); 150 151 //プロジェクション変換(射影変換)-------------------------------------- 152 //透視変換(遠近感を作る) 153 //カメラは原点に有り,z軸の負の方向を向いていて,上方向はy軸+方向である。 154 GLES.gluPerspective(pMatrix, 155 viewingangle, //Y方向の画角 156 aspect, //アスペクト比 157 .1f, //ニアクリップ z=-.1から 158 20.0f);//ファークリップ Z=-10までの範囲を表示することになる 159 GLES.setPMatrix(pMatrix); 160 161 float[] c1Matrix=new float[16]; //カメラ視点変換マトリックス作成用 162 float[] c2Matrix=new float[16]; //カメラ視点変換マトリックス作成用 163 164 165 //カメラビュー変換(視野変換)----------------------------------- 166 //portraitで使うアプリを想定 167 //カメラ視点が原点になるような変換 カメラを下向き,長手方向奥側を2D画面の上にする 168 Matrix.setLookAtM(c1Matrix, 0,//アイポイント、ビューの中心、アップベクトルの観点からのビュー変換を定義します。 169 0f,0f,0f, //カメラの視点 x,y,z 170 0.0f, 0.0f, -1.0f, //カメラの焦点 171 0.0f, 1.0f, 0.0f);//カメラの上方向 画面長手方向前方 172 173 c2Matrix = myRotationSensor.getRotMatrix(); 174 175 176 Matrix.translateM(c2Matrix,0,3f,0f,0f); 177 178 Matrix.multiplyMM(cMatrix, 0, c1Matrix, 0, c2Matrix, 0); //cMatrix = c1Matrix * c2Matrix 179 180 //カメラビュー変換はこれで終わり。 181 GLES.setCMatrix(cMatrix); 182 183 //cMatrixをセットしてから光源位置をセット 184 GLES.setLightPosition(LightPos); 185 186 int value = 0; 187 synchronized(sync) { // 別スレッドでlineが書き換わるかもしれないので、synchronizedで同期を取る 188 value = Integer.parseInt(line); 189 } 190 191 192 //ボール 193 Matrix.setIdentityM(mMatrix, 0); 194 Matrix.translateM(mMatrix, 0, value, 0f, 0f); 195 Matrix.scaleM(mMatrix, 0, 0.3f, 0.3f, 0.3f); 196 GLES.updateMatrix(mMatrix);//現在の変換行列をシェーダに指定 197 //MySphereの描画本体 198 // r, g, b, a, shininess(1以上の値 大きな値ほど鋭くなる) 199 MySphere.draw(1.5f, 1.5f, 0f, 1f, 5.f); 200 201 202 GLES.enableShading(); //シェーディング機能を使う設定に戻す 203 204 GLES.enableTexture(); 205 206 207 } 208 209} 210
contextを用いずとも、このコードを新しく作ったクラスに書きインスタンスを渡すことで実現可能でしょうか?
「contextの持ち回し」や「クラス間で共有」などと調べても目的にあったものを見つけ出すことができませんでした。
#追記
java
1 2 3 public void connect() { 4 new AsyncTask<Void, String, String>() { 5 @Override 6 protected String doInBackground(Void... voids) { 7 while (true) { 8 9 Socket socket = null; 10 BufferedReader reader = null; 11 try { 12 socket = new Socket("アドレス", 4000); 13 14 reader = new BufferedReader( 15 new InputStreamReader(socket.getInputStream())); 16 17 String temp = reader.readLine(); 18 synchronized(sync) { 19 line = temp; 20 } 21 } catch(Exception e) { 22 e.printStackTrace(); 23 } finally { 24 if(reader != null) { 25 try { 26 reader.close(); 27 } catch(Exception e) {} 28 } 29 if(socket != null) { 30 try { 31 socket.close(); 32 } catch(Exception e) {} 33 } 34 } 35 } 36 return null; 37 } 38 }.execute(); 39 } 40 41 42 43
connect()修正したがreturn nullでエラーが出てしまう。
回答1件
あなたの回答
tips
プレビュー