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

该博客探讨了一个Android应用在使用线程处理任务时遇到的问题,即在new Thread中耗时操作后,主线程仍然卡死。作者提供了可能的原因分析,并给出了两种解决建议:将Handler处理移到run()中,或者使用AsyncTask来处理耗时操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在学多线程任务处理,在以前的一个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 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) 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 list;

public Handler thHandler = new Handler(){

public void handleMessage(Message msg){

Message m = new Message();

m.what = msg.what;

ArrayAdapter 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(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();

}

}

}

解决方案

10

你这哪里是用子线程了啊。用的还是主线程。Handle的处理是在主线程。你要把Handle处理放到run()中。而不是把handle定义在子线程的类里。

10

假如不是很复杂的线程操作 完全可以这样写

Thread myThread = new Thread(new Runnable() {

@Override

public void run() {

//这里做耗时操做

//......

//......

//做完以后

runOnUiThread(new Runnable() {

@Override

public void run() {

//回主线程

}

});

}

});

myThread.start();

10

可以试试用AsyncTask,一般网络耗时操作本人都是用这个的

http://blog.csdn.net/anroidfinalbreak/article/details/38338107

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明新建thread耗时,主线程依然卡死!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值