java.lang.RuntimeException:无法在未调用 Looper.prepare() 的线程内创建处理程序,在 android 中出现运行时错误
Posted
技术标签:
【中文标题】java.lang.RuntimeException:无法在未调用 Looper.prepare() 的线程内创建处理程序,在 android 中出现运行时错误【英文标题】:java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() getting runtime error in android 【发布时间】:2016-01-13 12:07:44 【问题描述】:在 android 中获取这个 RuntimeException
:
java.lang.RuntimeException:无法在线程内创建处理程序 没有调用 Looper.prepare() 得到运行时错误 Toast.makeText(this, latitude+""+longitude, 1).show();
在函数updateLocation()
中。
public class Location_update extends Service
double latitude;
double longitude;
GPSLocation gps;
boolean state=true;
@Override
public IBinder onBind(Intent intent)
// TODO Auto-generated method stub
return null;
@Override
public void onCreate()
// TODO Auto-generated method stub
super.onCreate();
Timer timer = new Timer();
timer.schedule(task, 0,1000*30);
TimerTask task=new TimerTask()
@Override
public void run()
// TODO Auto-generated method stub
updateLocation();
;
public void updateLocation()
gps = new GPSLocation(MainActivity.dis);
// check if GPS enabled
if(gps.canGetLocation())
latitude = gps.getLatitude();
longitude = gps.getLongitude();
try
Toast.makeText(this, latitude+""+longitude, 1).show();
catch(Exception e)
Log.d("error", "msg:-- "+e);
// \n is for new line
//Toast.makeText(Location_update.this, "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
else
// can't get location
// GPS or Network is not enabled
// Ask user to enable GPS/network in settings
gps.showSettingsAlert();
if(gps.getLatitude()!=0.0 && gps.getLongitude()!=0.0)
try
String url = "http://surajsingh.freetzi.com/insert_longi_latti.php?latti="+latitude+"&longi="+longitude;
HttpGet get = new HttpGet(url);
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpResponse httpResponse = httpClient.execute(get);
HttpEntity httpEntity = httpResponse.getEntity();
String data = EntityUtils.toString(httpEntity);
JSONObject obj = new JSONObject(data);
int status = obj.getInt("status");
catch (Exception e)
// TODO: handle exception
// Toast.makeText(Location_update.this, ""+e, 1).show();
Log.d("error", ""+e);
【问题讨论】:
【参考方案1】:您从工作线程调用它。您需要从主线程中调用 Toast.makeText()。您可以使用处理程序。
【讨论】:
【参考方案2】:Sunny 的回答是对的。您需要使用Handler
。
在您的Service
中创建Handler
。
Handler h = new Handler()
@Override
public void handleMessage(Message msg)
String aResponse = msg.getData().getString("message");
Toast.makeText(this, aResponse , 1).show();
;
然后将消息传递给Handler
,如下所示。
if(gps.canGetLocation())
latitude = gps.getLatitude();
longitude = gps.getLongitude();
/*************/
Bundle b = new Bundle();
b.putString("message", latitude +" "+longitude);
Message msg = h.obtainMessage();
msg.setData(b);
handler.sendMessage(msg);
/*************/
【讨论】:
以上是关于java.lang.RuntimeException:无法在未调用 Looper.prepare() 的线程内创建处理程序,在 android 中出现运行时错误的主要内容,如果未能解决你的问题,请参考以下文章