作为序言,我是一名学生,对Java /编程尚不陌生。我对android框架很陌生。我希望5个骰子的ImageView循环循环播放,就像它们滚动一样。我相信我遇到的主要问题是我的UI更改发生在onCreate()之外。有没有办法桥接MainActivity和单独的Java类?
MainActivity
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button rollButton = (Button) findViewById(R.id.rollButton);
rollButton.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Thread die1 = new Thread((Runnable) new ShipDriver(0));
die1.start();
单独的Java类
public class ShipDriver implements Runnable {
ImageView imageView;
ImageView imageView2;
ImageView imageView3;
ImageView imageView4;
ImageView imageView5;
int dieIndex;
int rolled;
Handler myHandlerObj;
Runnable runnable;
public static final Random RANDOM = new Random();
public ShipDriver(int tdieIndex) {
dieIndex = tdieIndex;
}
public void run() {
rolled = randomDiceValue();
Handler myHandlerObj = new Handler(Looper.getMainLooper());
for(int i=0; i<40; i++) {
try {
Thread.sleep(1000);
}catch (InterruptedException e) {
e.printStackTrace();
}
if (dieIndex == 0) {
myHandlerObj.post(new Runnable() {
@Override
public void run() {
switch (rolled) {
case 1:
imageView.setImageResource(R.drawable.die1);
case 2:
imageView.setImageResource(R.drawable.die2);
case 3:
imageView.setImageResource(R.drawable.die3);
case 4:
imageView.setImageResource(R.drawable.die4);
case 5:
imageView.setImageResource(R.drawable.die5);
case 6:
imageView.setImageResource(R.drawable.die6);
}
}
});
if (dieIndex == 1) {
myHandlerObj.post(new Runnable() {
@Override
public void run() {
switch (rolled) {
case 1:
imageView2.setImageResource(R.drawable.die1);
case 2:
imageView2.setImageResource(R.drawable.die2);
case 3:
imageView2.setImageResource(R.drawable.die3);
case 4:
imageView2.setImageResource(R.drawable.die4);
case 5:
imageView2.setImageResource(R.drawable.die5);
case 6:
imageView2.setImageResource(R.drawable.die6);
}
}
});
}
......
在logcat中,我收到此错误:
attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
我有点不知所措。任何见识将不胜感激。
答案 0 :(得分:0)
我认为问题在于您正在尝试在主线程之外进行UI更改,而您无法在Android上进行更改,而是尝试使用runOnUiThread,如下例所示:
runOnUiThread(new Runnable() {
@Override
public void run() {
}
}
答案 1 :(得分:0)
您是否尝试过设置上下文? 我认为这会有所帮助...
尝试使用上下文上下文。
context.imageview.setImageResource
或
this.imageview.setImageResource
只是一个猜测
更新: 以这个为例
public static ImageView Warning_image;
public static TextView Warning_text;
public static Handler mainHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Warning_image = findViewById(R.id.Status_Image);
Warning_text = findViewById(R.id.Warning_text);
Runnable rcWarningControl = new cWarningControl();
rcWarningControl.run();
public class cWarningControl extends MainActivity implements Runnable {
@Override
public void run() {
while(true)
{
if (cGlobal_values.bBT_NOADAPTER) {
mainHandler.post(new Runnable() {
@Override
public void run() {
MainActivity.Warning_image.setImageResource(R.mipmap.warnung_bt_red);
MainActivity.Warning_text.setText(R.string.warning_BT_NO_Adapter);
}
});
}
if (!cGlobal_values.bBT_GenState_on) {
mainHandler.post(new Runnable() {
@Override
public void run() {
MainActivity.Warning_image.setImageResource(R.mipmap.warnung_bt_red);
MainActivity.Warning_text.setText(R.string.warning_BT_OFF);
}
});
}
if (cGlobal_values.bBT_GenState_on) {
if (cGlobal_values.bBT_ConState_connected) {
mainHandler.post(new Runnable() {
@Override
public void run() {
MainActivity.Warning_image.setImageResource(R.mipmap.warnung_bt_green);
MainActivity.Warning_text.setText(R.string.warning_BT_ON_CON);
}
});
} else {
mainHandler.post(new Runnable() {
@Override
public void run() {
MainActivity.Warning_image.setImageResource(R.mipmap.warnung_bt_yellow);
MainActivity.Warning_text.setText(R.string.warning_BT_ON_NOCON);
}
});
}
}
Log.d(TAG, "run: ");
sleep(1000);
}
}
}
您必须在res中创建的字符串(R.string.XXX)或仅由您自己创建。 图像obj相同。
答案 2 :(得分:0)
未初始化对象时,将出现显示的错误。首先,您要初始化imageview对象。显示的错误不是线程错误。
答案 3 :(得分:0)
我发现我的零点异常。我的findViewByID(用于imageViews)设置不正确。我让他们寻找R.drawable.imgs。它必须是R.id.imageview。
但是,我遇到了一个新问题,即图像无法循环播放。我想我会做更多的挖掘。在为这个问题ash了40个小时之后,我很高兴能够取得进展。下面是我的解决方案的代码。
import android.annotation.SuppressLint;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Switch;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
public static ImageView imageView1;
public static Handler mainHandler = new Handler();
Button rollDie;
@SuppressLint("ResourceType")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView1 = (ImageView) findViewById(R.id.imageView1);
rollDie = findViewById(R.id.rollDie);
rollDie.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Runnable die1 = new ShipDriver(0);
die1.run();
}
});
}
}
ShipDriver类:
package com.example.bernh.cptshipmatecrew;
import android.annotation.SuppressLint;
import android.os.Handler;
import android.widget.ImageView;
import java.util.Random;
public class ShipDriver extends MainActivity implements Runnable {
int dieIndex;
Random random;
int rolled;
ImageView imageView1;
Handler mainHandler = new Handler();
public ShipDriver(int dieIndex) {
this.dieIndex = dieIndex; //why do we declare this. Is this shipdriver obj or MainObj
}
@SuppressLint("ResourceType")
@Override
public void run() {
Random random = new Random();
rolled = random.nextInt(6) + 1;
for (int i = 0; i < 30; i++) {
try {
Thread.sleep(500);
} catch(Exception e) {
e.printStackTrace();
}
if (dieIndex == 0) {
mainHandler.post(new Runnable() {
@Override
public void run() {
switch (rolled) {
case 1:
MainActivity.imageView1.setImageResource(R.drawable.die1);
break;
case 2:
MainActivity.imageView1.setImageResource(R.drawable.die2);
break;
case 3:
MainActivity.imageView1.setImageResource(R.drawable.die3);
break;
case 4:
MainActivity.imageView1.setImageResource(R.drawable.die4);
break;
case 5:
MainActivity.imageView1.setImageResource(R.drawable.die5);
break;
case 6:
MainActivity.imageView1.setImageResource(R.drawable.die6);
break;
}
}
});
}
// if (dieIndex == 1) {
// mainHandler.post(new Runnable() {
// @Override
// public void run() {
// switch (rolled) {
// case 1:
// MainActivity.imageView.setImageResource(R.drawable.die1);
// case 2:
// MainActivity.imageView.setImageResource(R.drawable.die2);
// case 3:
// MainActivity.imageView.setImageResource(R.drawable.die3);
// case 4:
// MainActivity.imageView.setImageResource(R.drawable.die4);
// case 5:
// MainActivity.imageView.setImageResource(R.drawable.die5);
// case 6:
// MainActivity.imageView.setImageResource(R.drawable.die6);
//
// }
// }
//
// });
// }
// if (dieIndex == 2) {
// mainHandler.post(new Runnable() {
// @Override
// public void run() {
// switch (rolled) {
// case 1:
// MainActivity.imageView.setImageResource(R.drawable.die1);
// case 2:
// MainActivity.imageView.setImageResource(R.drawable.die2);
// case 3:
// MainActivity.imageView.setImageResource(R.drawable.die3);
// case 4:
// MainActivity.imageView.setImageResource(R.drawable.die4);
// case 5:
// MainActivity.imageView.setImageResource(R.drawable.die5);
// case 6:
// MainActivity.imageView.setImageResource(R.drawable.die6);
//
// }
// }
//
// });
// }
// if (dieIndex == 3) {
// mainHandler.post(new Runnable() {
// @Override
// public void run() {
// switch (rolled) {
// case 1:
// MainActivity.imageView.setImageResource(R.drawable.die1);
// case 2:
// MainActivity.imageView.setImageResource(R.drawable.die2);
// case 3:
// MainActivity.imageView.setImageResource(R.drawable.die3);
// case 4:
// MainActivity.imageView.setImageResource(R.drawable.die4);
// case 5:
// MainActivity.imageView.setImageResource(R.drawable.die5);
// case 6:
// MainActivity.imageView.setImageResource(R.drawable.die6);
//
// }
// }
//
// });
// }
// if (dieIndex == 4) {
// mainHandler.post(new Runnable() {
// @Override
// public void run() {
// switch (rolled) {
// case 1:
// MainActivity.imageView.setImageResource(R.drawable.die1);
// case 2:
// MainActivity.imageView.setImageResource(R.drawable.die2);
// case 3:
// MainActivity.imageView.setImageResource(R.drawable.die3);
// case 4:
// MainActivity.imageView.setImageResource(R.drawable.die4);
// case 5:
// MainActivity.imageView.setImageResource(R.drawable.die5);
// case 6:
// MainActivity.imageView.setImageResource(R.drawable.die6);
//
// }
// }
//
// });
// }
}
}
}