编辑:如果在调用onConfigurationChanged时有人想要答案我只是初始化我在onCreate中所做的所有变量
您好我有一个应用程序显示进度对话框,然后在从相机拍摄的图像视图中显示图像。问题是当我在横向拍摄照片时,然后等待对话框完成任何图像视图中没有显示的内容,并且没有按钮工作。它常常在对话框即将显示时崩溃,但我修复了它。以下是我的一些代码:
public class AnnoyingMeterActivity extends Activity {
Random r = new Random(System.currentTimeMillis());
class ProgressThread extends Thread {
Handler mHandler;
final static int STATE_DONE = 0;
final static int STATE_RUNNING = 1;
int mState;
int total;
ProgressThread(Handler h) {
mHandler = h;
}
public void run() {
mState = STATE_RUNNING;
total = 0;
while (mState == STATE_RUNNING) {
try {
Thread.sleep(55);
} catch (InterruptedException e) {
}
Message msg = mHandler.obtainMessage();
msg.arg1 = total;
mHandler.sendMessage(msg);
total++;
}
}
/*
* sets the current state for the thread, used to stop the thread
*/
public void setState(int state) {
mState = state;
}
}
TextView tv;
ImageView iv;
TextView tv1;
static final int PROGRESS_DIALOG = 0;
ProgressThread progressThread;
ProgressDialog progressDialog;
Bitmap person;
ImageView tiv;
ImageView iv2;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button scanPersonButton = (Button) findViewById(R.id.scanPerson);
scanPersonButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
scanPerson();
}
});
tv = (TextView) findViewById(R.id.tv);
iv = (ImageView) findViewById(R.id.annoyingMeterImage);
iv.setBackgroundResource(R.drawable.finalmeter);
tv1 = (TextView) findViewById(R.id.textView1);
tiv = (ImageView) findViewById(R.id.imageView1);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setContentView(R.layout.main);
}
protected void scanPerson() {
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(intent, 0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
person = (Bitmap) data.getExtras().get("data");
showDialog(PROGRESS_DIALOG);
}
}
protected void randomImageDisplayThing() {
tiv.setBackgroundDrawable(new BitmapDrawable(person));
switch (annoyingRating) {
case 0:
iv.setBackgroundResource(R.drawable.finalmeter0);
break;
case 1:
iv.setBackgroundResource(R.drawable.finalmeter1);
break;
case 2:
iv.setBackgroundResource(R.drawable.finalmeter2);
break;
case 3:
iv.setBackgroundResource(R.drawable.finalmeter3);
break;
case 4:
iv.setBackgroundResource(R.drawable.finalmeter4);
break;
case 5:
iv.setBackgroundResource(R.drawable.finalmeter5);
break;
case 6:
iv.setBackgroundResource(R.drawable.finalmeter6);
break;
case 7:
iv.setBackgroundResource(R.drawable.finalmeter7);
break;
case 8:
iv.setBackgroundResource(R.drawable.finalmeter8);
break;
case 9:
iv.setBackgroundResource(R.drawable.finalmeter9);
break;
case 10:
iv.setBackgroundResource(R.drawable.finalmeter10);
break;
case 11:
iv.setBackgroundResource(R.drawable.finalmeter11);
break;
}
}
protected Dialog onCreateDialog(int id) {
switch (id) {
case PROGRESS_DIALOG:
progressDialog = new ProgressDialog(this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("Scanning...");
return progressDialog;
default:
return null;
}
}
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
int total = msg.arg1;
progressDialog.setProgress(total);
if (total >= 100) {
dismissDialog(PROGRESS_DIALOG);
progressThread.setState(ProgressThread.STATE_DONE);
randomImageDisplayThing();
}
}
};
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
switch (id) {
case PROGRESS_DIALOG:
progressDialog.setProgress(0);
progressThread = new ProgressThread(handler);
progressThread.start();
}
}
}
现在我真的不知道该怎么做。我认为问题可能与方向改变有关。任何帮助表示赞赏!
答案 0 :(得分:0)
尝试使用AsyncTask
代替自定义线程。因为有些事情是假设在UI线程上运行并且在后台线程上休息而AsyncTask使这很容易。同样通过查看线程代码来调试线程代码既困难又不可靠。
http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html http://developer.android.com/reference/android/os/AsyncTask.html