新建thread耗时,主线程依然卡死

Bleach3 2016-08-06 07:29:29
最近在学多线程任务处理,在以前的一个demo中用了一下,结果在new thread中耗时,主线程依然卡住。求大神指教。
package com.calendar.weather;

import java.util.List;

import com.example.liujiangcalendar.R;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.Toast;

public class WeatherActivity extends Activity {
// 分别显示近三天的天气信息和城市介绍

private Spinner city, citys;
private List<String> weater;
private TextView cityNames1, cityNames2, cityNames3, cityjie;
private ImageView weateImage1, weateImage2, weateImage3;
private final int SUCCESS = 1;
private final int FAIL = 0;
private final int GET_CITYS = 0;
private final int GET_CITY = 1;
private final int GET_WEATHER = 2;
private weThread wth;
public Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_weather);
citys = (Spinner) findViewById(R.id.citys);
citys.setAdapter(null);
city = (Spinner) findViewById(R.id.city);
city.setAdapter(null);
cityNames1 = (TextView) findViewById(R.id.cityNames1);
cityNames2 = (TextView) findViewById(R.id.cityNames2);
cityNames3 = (TextView) findViewById(R.id.cityNames3);
cityjie = (TextView) findViewById(R.id.cityjie);
weateImage1 = (ImageView) findViewById(R.id.weateImage1);
weateImage2 = (ImageView) findViewById(R.id.weateImage2);
weateImage3 = (ImageView) findViewById(R.id.weateImage3);

mHandler = new Handler(){

public void handleMessage(Message msg){
if (msg.arg1 == SUCCESS){
switch(msg.what){
case GET_CITYS:
citys.setAdapter((SpinnerAdapter) msg.obj);
break;
case GET_CITY:
city.setAdapter((SpinnerAdapter) msg.obj);
break;
case GET_WEATHER:
weater = (List<String>) msg.obj;
cityNames1.setText(weater.get(6) + "\n" + weater.get(5) + "\n"
+ weater.get(7));
//cityNames1.setBackgroundResource(Image.imageId(weater.get(8)));
weateImage1.setImageResource(Image.imageId(weater
.get(8)));
cityNames2.setText(weater.get(13) + "\n" + weater.get(12) + "\n"
+ weater.get(14));
//cityNames2.setBackgroundResource(Image.imageId(weater.get(15)));
weateImage2.setImageResource(Image.imageId(weater
.get(15)));
cityNames3.setText(weater.get(18) + "\n" + weater.get(17) + "\n"
+ weater.get(19));
//cityNames3.setBackgroundResource(Image.imageId(weater.get(20)));
weateImage3.setImageResource(Image.imageId(weater
.get(21)));
cityjie.setText(weater.get(22));
break;
}
}else{
Toast.makeText(WeatherActivity.this, "无法获取信息,请检查网络设置之后重试", Toast.LENGTH_SHORT).show();
//WeatherActivity.this.finish();
}
}
};




citys.setOnItemSelectedListener(new OnItemSelectedListener() {

@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
Message msg = new Message();
msg.what = GET_CITY;
Bundle b = new Bundle();
b.putString("citys", citys.getSelectedItem().toString());
msg.setData(b);
wth.thHandler.sendMessage(msg);

}

@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub

}
});

city.setOnItemSelectedListener(new OnItemSelectedListener() {
// 返回数据: 一个一维数组 String(22),共有23个元素。
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {

Message msg = new Message();
msg.what = GET_WEATHER;
Bundle b = new Bundle();
b.putString("citys", city.getSelectedItem().toString());
msg.setData(b);
wth.thHandler.sendMessage(msg);


}

@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub

}


});

}

@Override
public void onStart(){
super.onStart();

wth = new weThread();
Message msg01 = new Message();
msg01.what = GET_CITYS;
wth.thHandler.sendMessage(msg01);
wth.start();
}

class weThread extends Thread{
private List<String> list;
public Handler thHandler = new Handler(){
public void handleMessage(Message msg){

Message m = new Message();
m.what = msg.what;
ArrayAdapter<String> mAdater = null;
if(msg.what == GET_WEATHER){
try{
list = WeatherInfo.getWeather(msg.getData().getString("citys"));
if (list != null && !list.isEmpty())
m.arg1 = SUCCESS;
else
m.arg1 = FAIL;
}catch(Exception e){
m.arg1 = FAIL;
}finally{
m.obj = list;
Log.i("*******", "send message arg1 ="+m.arg1);
WeatherActivity.this.mHandler.sendMessage(m);
}
}else{
try {
if(msg.what == GET_CITY)
list = WeatherInfo.getCity(msg.getData().getString("citys"));
else
list = WeatherInfo.getCitys();

mAdater = new ArrayAdapter<String>(WeatherActivity.this,
android.R.layout.simple_list_item_multiple_choice, list);

if(mAdater != null && !mAdater.isEmpty())
m.arg1 = SUCCESS;
else
m.arg1 = FAIL;
} catch (Exception e) {
m.arg1 = FAIL;
}

m.obj = mAdater;
Log.i("*******", "send message arg1 ="+m.arg1);
WeatherActivity.this.mHandler.sendMessage(m);
}


}
};

@Override
public void run(){
Looper.prepare();
Looper.loop();

}
}
}
...全文
577 6 打赏 收藏 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bleach3 2016-08-10
  • 打赏
  • 举报
回复
引用 5 楼 lj19851227 的回复:
可以试试用AsyncTask,一般网络耗时操作我都是用这个的 http://blog.csdn.net/anroidfinalbreak/article/details/38338107
学习了,谢谢
peter_nj_RD 2016-08-09
  • 打赏
  • 举报
回复
可以试试用AsyncTask,一般网络耗时操作我都是用这个的 http://blog.csdn.net/anroidfinalbreak/article/details/38338107
Bleach3 2016-08-08
  • 打赏
  • 举报
回复
引用 3 楼 a81658804 的回复:
如果不是很复杂的线程操作 完全可以这样写

Thread myThread = new Thread(new Runnable() {
            @Override
            public void run() {
                //这里做耗时操做
                //......
                //......
                //做完以后
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        //回主线程
                    }
                });
            }
        });
        myThread.start();
改成直接往子线程构造方法里传参数了,不知道为什么子线程handle message总是有问题。
a81658804 2016-08-08
  • 打赏
  • 举报
回复
如果不是很复杂的线程操作 完全可以这样写

Thread myThread = new Thread(new Runnable() {
            @Override
            public void run() {
                //这里做耗时操做
                //......
                //......
                //做完以后
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        //回主线程
                    }
                });
            }
        });
        myThread.start();
Bleach3 2016-08-08
  • 打赏
  • 举报
回复
引用 1 楼 winter_sui 的回复:
你这哪里是用子线程了啊。用的还是主线程。Handle的处理是在主线程。你要把Handle处理放到run()中。而不是把handle定义在子线程的类里。
改了以后,发送给子线程message以后,子线程没反应啊
winter_sui 2016-08-07
  • 打赏
  • 举报
回复
你这哪里是用子线程了啊。用的还是主线程。Handle的处理是在主线程。你要把Handle处理放到run()中。而不是把handle定义在子线程的类里。

80,490

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧