Android: ANR, 스레드 간 통신, Handler, 메시지

장면: 버튼 1을 클릭하여 다운로드를 진행하고 진도표의 진도 변화를 표시합니다. 10초 후 다운로드가 완료되면 진도표가 사라집니다.버튼 2를 누르면 업데이트가 완료되고 회전진도조가 나타나며 5초 후 업데이트가 완료되면 진도조가 사라집니다.
public class MainActivity extends Activity implements OnClickListener
{
    TextView textView = null;
    private ProgressBar mProgress_yuan;
    private ProgressBar mProgress_jindu;
    private final int MSG_WHAT_DOWNLOAD = 1;
    private final int MSG_WHAT_UPDATE = 2;
    private final int MSG_WHAT_PROGRESS = 3;
                  
    private Handler mHandler = new Handler()// Handler   main  , main      
    {
        @Override
        public void handleMessage(Message msg)//   handleMessage  
        {
            switch (msg.what)
            {
            case MSG_WHAT_DOWNLOAD:
                Data data = (Data) msg.obj;
                textView.setText(data.toString());
                mProgress_jindu.setVisibility(View.GONE);//      ,     
                break;
                          
            case MSG_WHAT_UPDATE:
                String str = (String) msg.obj;
                textView.setText(str);
                mProgress_yuan.setVisibility(View.GONE);//      ,       
                break;
            case MSG_WHAT_PROGRESS:
                int arg = msg.arg1;
                mProgress_jindu.setProgress(arg);//       ,     
                break;
                          
            default:
                break;
            }
        }
    };
                  
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
                      
        findViewById(R.id.button1).setOnClickListener(this);
        findViewById(R.id.button2).setOnClickListener(this);
        textView = (TextView) findViewById(R.id.textView1);
        mProgress_yuan = (ProgressBar) findViewById(R.id.progressBar1);
        mProgress_jindu = (ProgressBar) findViewById(R.id.progressBar2);
    }
                  
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
                  
    @Override
    public void onClick(View v)
    {
        switch (v.getId())
        {
        case R.id.button1:
            btn1Click();
            break;
        case R.id.button2:
            btn2Click();
            break;
                      
        default:
            break;
        }
    }
                  
    private void btn1Click()//     ,10      ,     
    {
        mProgress_jindu.setVisibility(View.VISIBLE);//         (xml      )
        new Thread()
        {
            @Override
            public void run()
            {
                Message message = new Message();
                message.what = MSG_WHAT_DOWNLOAD; //     
                message.obj = download();//        msg,                 
                mHandler.sendMessage(message);//   Handler  msg
            }
        }.start();
                      
    }
                  
    private void btn2Click()//     ,       ,3      ,     
    {
        mProgress_yuan.setVisibility(View.VISIBLE);
        new Thread()
        {
            @Override
            public void run()
            {
                try
                {
                    Thread.sleep(3000);
                    String str = update();
                                  
                    //Message msg = mHandler.obtainMessage(what, obj)
                    //               
                    Message msg = new Message();
                    msg.what = MSG_WHAT_UPDATE;
                    msg.obj = str;
                    mHandler.sendMessage(msg);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
        }.start();
    }
                  
    private Data download()
    {
        for (int i = 0; i < 10; i++)//         
        {
            //Message msg = new Message();
            Message msg = mHandler.obtainMessage();//           msg,      msg  
            msg.what = MSG_WHAT_PROGRESS;
            msg.arg1 = i * 10;
            mHandler.sendMessage(msg);//         main       
            try
            {
                Thread.sleep(1000);// 10      
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
        Data data = new Data("    !", 12);
        return data;
    }
                  
    private String update()
    {
        return "    !";
    }
                  
    class Data
    {
        String name;
        int num;
                      
        public Data(String name, int num)
        {
            super();
            this.name = name;
            this.num = num;
        }
                      
        @Override
        public String toString()
        {
            return "data [name=" + name + ", num=" + num + "]";
        }
                      
    }
}

본고는'하늘에 흔적은 없지만 나는 날아간다'블로그에서 나온 것으로 작가에게 연락하세요!

좋은 웹페이지 즐겨찾기