今天在学Handler,写了段点击OK 读进度条,读完后跳转的代码有两个问题:
1 在注释1的地方,如果把注释去掉,就会报错,也就是说进度条读完后,执行将进度条隐藏的命令会报错,是为什么?
2 读完进度条,跳转到另一个Activity后,按back键,无法回到第一个Activity,这又是为什么呢?
package com.progressbartest;import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.os.Bundle;
import android.os.Message;
import android.widget.*;
import android.content.*;
import android.os.*;public class ProgressBarTest extends Activity {
/** Called when the activity is first created. */ Button button_ok;
Button button_cancel;
ProgressBar progressbar;
MyHandler myHandler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
HandlerThread handlerThread = new HandlerThread("handler_thread");
handlerThread.start();
myHandler = new MyHandler(handlerThread.getLooper());
button_ok = (Button)findViewById(R.id.ok);
button_cancel = (Button)findViewById(R.id.cancel);
progressbar = (ProgressBar)findViewById(R.id.progressbar);
button_ok.setOnClickListener(new button_okListener());
button_cancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
myHandler.removeCallbacks(progressThread);
}
});
} class MyHandler extends Handler {
MyHandler(){}
MyHandler(Looper looper){
super(looper);
}
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
progressbar.setProgress(msg.arg1);
if(msg.arg1 >= 100){
/*注释1 progressbar.setVisibility(ProgressBar.INVISIBLE);*/
myHandler.removeCallbacks(progressThread);
Intent intent = new Intent();
intent.setClass(ProgressBarTest.this, ListViewTest.class);
ProgressBarTest.this.startActivity(intent);
}
myHandler.post(progressThread);
}
}
Runnable progressThread = new Runnable(){
int i = 0;
@Override
public void run() {
// TODO Auto-generated method stub
i+=8;
Message msg = myHandler.obtainMessage();
msg.arg1 = i;
try{
Thread.sleep(300);
}catch(InterruptedException e){
e.printStackTrace();
}
myHandler.sendMessage(msg);
}
};
class button_okListener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
progressbar.setVisibility(ProgressBar.VISIBLE);
myHandler.post(progressThread);
}
}
}
1 在注释1的地方,如果把注释去掉,就会报错,也就是说进度条读完后,执行将进度条隐藏的命令会报错,是为什么?
2 读完进度条,跳转到另一个Activity后,按back键,无法回到第一个Activity,这又是为什么呢?
package com.progressbartest;import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.os.Bundle;
import android.os.Message;
import android.widget.*;
import android.content.*;
import android.os.*;public class ProgressBarTest extends Activity {
/** Called when the activity is first created. */ Button button_ok;
Button button_cancel;
ProgressBar progressbar;
MyHandler myHandler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
HandlerThread handlerThread = new HandlerThread("handler_thread");
handlerThread.start();
myHandler = new MyHandler(handlerThread.getLooper());
button_ok = (Button)findViewById(R.id.ok);
button_cancel = (Button)findViewById(R.id.cancel);
progressbar = (ProgressBar)findViewById(R.id.progressbar);
button_ok.setOnClickListener(new button_okListener());
button_cancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
myHandler.removeCallbacks(progressThread);
}
});
} class MyHandler extends Handler {
MyHandler(){}
MyHandler(Looper looper){
super(looper);
}
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
progressbar.setProgress(msg.arg1);
if(msg.arg1 >= 100){
/*注释1 progressbar.setVisibility(ProgressBar.INVISIBLE);*/
myHandler.removeCallbacks(progressThread);
Intent intent = new Intent();
intent.setClass(ProgressBarTest.this, ListViewTest.class);
ProgressBarTest.this.startActivity(intent);
}
myHandler.post(progressThread);
}
}
Runnable progressThread = new Runnable(){
int i = 0;
@Override
public void run() {
// TODO Auto-generated method stub
i+=8;
Message msg = myHandler.obtainMessage();
msg.arg1 = i;
try{
Thread.sleep(300);
}catch(InterruptedException e){
e.printStackTrace();
}
myHandler.sendMessage(msg);
}
};
class button_okListener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
progressbar.setVisibility(ProgressBar.VISIBLE);
myHandler.post(progressThread);
}
}
}
解决方案 »
- android中是使用socket和http进行通信,哪种方式更好,更常用?假如数据访问量很大的情况下,应该使用哪种?
- android4.0 耗时任务的问题
- android 平台下, 前后camera 不能用, lsmod 时, 显示如下. 是什么地方的问题呢?
- android下有没有sd卡的自动运行机制,一插卡就自动运行卡里面的安装程序
- android的WebView刷开谷歌百度地图的问题
- ProgressBar 有停止、销毁等操作吗?
- android 真机 socket通信 PC tomcat 服务器的求助
- 用android实现了简单的拨号功能,模拟器下没有问题,部署到真机上,就是没反应
- Android中获取在AlertDialog 中的EditText 的内容是崩溃
- Android收不到udp广播,试过网上的多播锁的方法,没有作用,求大神帮忙提下意见
- Toast 问题!
- 关于用logcat查看调试的问题
}
在这个IF的最后面加个return就好了
if(msg.arg1 >= 100){
........
return
}
不知道为什么,只要 progressbar.setVisibility(ProgressBar.INVISIBLE); 语句出现在带有handler语句的代码块里,通通会报错,不管在哪里我是通过 @Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
progressbar.setVisibility(ProgressBar.INVISIBLE);
System.out.println("ProgressBar is invisible");
}这个方法,在激活了另一个Activity之后,设置进度条消失,然后回来就看不到了。
在点击之后提前停止线程的运行 这个不知道怎么实现根据我的观察,removeCallbacks是把线程移出消息队列
但是线程还没有结束 还在继续运行,也就是说我的button_cancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
myHandler.removeCallbacks(progressThread);
progressbar.setVisibility(ProgressBar.INVISIBLE);
}
});执行后,虽然进度条消失了,但是i还是在不断自增,超过100时跳转到另一个Activity。
睡觉先了