主线程中的handle问题-阿里云开发者社区

开发者社区> 非花非雾> 正文

主线程中的handle问题

简介:
+关注继续查看

昨天遇到的一个问题,就是我在主线程中生成了handler对象,但是在下边进行消息的发送的时候意外的报了异常,说是

  1. E/AndroidRuntime( 1819): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()  
  2. E/AndroidRuntime( 1819):        at android.os.Handler.(Handler.java:121)  
  3. E/AndroidRuntime( 1819):        at android.widget.Toast.(Toast.java:68)  
  4. E/AndroidRuntime( 1819):        at android.widget.Toast.makeText(Toast.java:231

           意思就是说不能创建一个handler来代替线程中没有被调用Looper.prepare(),然后我在代码中添加了

Looper.prepare(),Looper.loop()这俩个方法。


package cn.wisenergy.tp;



import java.util.ArrayList;
import java.util.List;


import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;


import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import cn.wisenergy.tp.commonality.HttpClientHelper;
import cn.wisenergy.tp.fragment.MainFragment2;
import cn.wisenergy.tp.fragment_person.ChooseFriendActivity;
import cn.wisenergy.tp.url.Urlhelp;


public class LoginActivity extends Activity implements OnClickListener {


private TextView login_binding;
private TextView login_binding_zhuce;
private TextView login_userName;
private EditText login_password;
private Button btn_login;

private SharedPreferences  spf;

private String name ;


private int userId;
private Handler handler = new Handler() {


public void handleMessage(android.os.Message msg) {


switch (msg.what) {
case 0:
Toast.makeText(LoginActivity.this, "登陆成功", Toast.LENGTH_SHORT).show();

Editor edit=spf.edit();

edit.putInt("userId", userId);
edit.putString("userName", name);
edit.putString("password", login_password.getText().toString());
edit.commit();
Intent intent = new Intent();
intent.setClass(LoginActivity.this, MainFragment2.class);


startActivity(intent);

finish();
break;


case 1:


Toast.makeText(LoginActivity.this, "登陆失败", Toast.LENGTH_SHORT)
.show();
break;
}


};
};
 
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
spf= getSharedPreferences("accountInfo", Context.MODE_PRIVATE);
name=spf.getString("userName", null);
setContentView(R.layout.login);
initViews();


}


public void initViews() {




login_userName  =(TextView)findViewById(R.id.login_userName);




login_userName.setText(name);

login_password =(EditText)findViewById(R.id.login_password);

login_binding = (TextView) findViewById(R.id.login_binding);
btn_login = (Button) findViewById(R.id.btn_logins);
login_binding_zhuce = (TextView) findViewById(R.id.login_binding_zhuce);

login_binding.setOnClickListener(this);
btn_login.setOnClickListener(this);
login_binding_zhuce.setOnClickListener(this);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.login, menu);
return true;
}


@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.login_binding:
// 切换到其它登陆方式
Intent intent = new Intent(LoginActivity.this, Login_bindingActivity.class);
startActivity(intent);
finish();
break;


case R.id.btn_logins:
// 登陆



submitLogin_info(name,login_password.getText().toString());






break;

case R.id.login_binding_zhuce:
//去注册
Intent intent2 = new Intent(LoginActivity.this, RegActivity.class);
startActivity(intent2);
finish();
break;


default:
break;
}


}






public int relateResult(String str) throws JSONException {


if (str != null && !str.equals("")) {
JSONObject json = new JSONObject(str);


if (json != null) {
if (!json.isNull("status")) {
JSONObject status = json.getJSONObject("status");//


if (!status.isNull("code")) {


int code = status.getInt("code");
return code;


} else {


Log.e("json", "没有code这个value");
}


}
}
} else {


Log.e("json", "json数据为空");
}
return 0;


}




public int relateResult1(String str) throws JSONException {


if (str != null && !str.equals("")) {
JSONObject json = new JSONObject(str);


if (json != null) {
if (!json.isNull("status")) {

 
int userId=json.getInt("data");
                    return userId;
}

} else {


Log.e("json", "json数据为空");
}
return 0;


}




public void submitLogin_info(final String name,
final String password) {



new Thread(new Runnable() {


@Override
public void run() {


Looper.prepare();
String result = HttpClientHelper.loadTextFromURL(Urlhelp.LOGIN+"loginName="+name+"&password="+password,name+":"+password,
LoginActivity.this);
Log.d("result", result);
if (result != null) {
int code;
try {
code = relateResult(result);
Log.d("CODE", code+"");
if (code == 2000) {

userId = relateResult1(result);

handler.sendEmptyMessage(0);
} else if (code == 4000) {
Toast.makeText(LoginActivity.this,
"指定用户不存在", Toast.LENGTH_SHORT).show();


} else if (code == 4001) {
Toast.makeText(LoginActivity.this,
"用户密码错误", Toast.LENGTH_SHORT).show();


} else if (code == 4002) {
Log.d("CODE", code+"");
Toast.makeText(LoginActivity.this,
"当前用户已被锁定不可登录(超出最大登录次数)",
Toast.LENGTH_SHORT).show();
} else if (code == 4003) {
Toast.makeText(LoginActivity.this,
"用户没有权限访问该资源", Toast.LENGTH_SHORT).show();


} else if (code == 4004) {


Toast.makeText(LoginActivity.this,
"用户认证信息已过期,需要更新", Toast.LENGTH_SHORT)
.show();
} else if (code == 4005) {
Toast.makeText(LoginActivity.this,
"用户未重新设置初试密码", Toast.LENGTH_SHORT).show();


} else if (code == 4006) {
Toast.makeText(LoginActivity.this,
"当前用户已被禁用(违规操作,管理员手动禁用)",
Toast.LENGTH_SHORT).show();
} else if (code == 4007) {
Toast.makeText(LoginActivity.this,
"接口参数非法:参数长度超出允许的最大值", Toast.LENGTH_SHORT)
.show();
} else if (code == 5009) {


Toast.makeText(LoginActivity.this,
"接口参数非法:参数长度超出允许的最小值", Toast.LENGTH_SHORT)
.show();
}
} catch (JSONException e) {


e.printStackTrace();
}


Looper.loop();
}
}
}).start();


}

}




版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10089 0
在C#中子线程如何操作主线程中窗体上控件
                                                       在C#中子线程如何操作主线程中窗体上控件         在C#中,直接在子线程中对窗体上的控件操作是会出现异常,这是由于子线程和运行窗体的线程是不同的空间,因此想要在子线程来操作窗体上的控件,是不可能简单的通过控件对象名来操作,但不是说不能进行操作,微软提供了Invoke的方法,其作用就是让子线程告诉窗体线程来完成相应的控件操作。
1044 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13892 0
EDAS ScheduleX 问题
浅谈 ScheduleX 简称分布式任务调度,简单的可以理解为就是一个分布式的计划任务,多台机器安装了 ScheduleX 的客户端后,用户可以在 控制台进行统计的任务调度和分配处理。 schedulerx-console 是 SchedulerX 的控制台,用于创建、管理定时任务。
2938 0
C#中通过Selenium定位<a>标签的问题
刚才在QQ群里看到有人提问,如何实现退出百度登录问题。那么之所以会有这个问题,主要是因为这个元素,如下图所示,是无法直接定位到的: 经过研究发现,要想定位到这种元素,拢共分两步: 第一步,把鼠标移到能使目标元素显示在页面上的前置元素上; 第二步,通过xpath对目标标签元素进行定位。
1196 0
Android gradle问题解决: This app has been built with an incorrect configuration. Please configure your build for VectorDrawableCompat
1. 问题描述: Android Studio在运行模拟器某些机型或者真机某些机型的时候发生闪退。 错误如下: Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.
1594 0
Android非UI主线程中,若干普通Java线程使用Handler发送接收消息
Android非UI主线程中,若干普通Java线程使用Handler发送接收消息 线程1和线程2均为普通Java线程,在Android中创建,然后在这两个普通Java线程中使用Handler发送和接收消息。
1023 0
+关注
81
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载