![](/img/trans.png)
[英]Android thread error - Can't create handler inside thread that has not called Looper.prepare()
[英]Android Waiting progress bar Can't create handler inside thread that has not called Looper.prepare() error
在我的android应用程序中,我将一些数据从服务器数据库复制到本地数据库,这可能需要15分钟以上的时间。 对于较慢的连接,可能会超过该值。 所以我想显示一个等待进度条。
该代码发布在下面。
refresh.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
final ProgressDialog progressDialog = ProgressDialog.show(login.this, "", "Please wait...");
new Thread() {
public void run() {
try{
mySQLiteAdapter.openToWrite();
mySQLiteAdapter.deleteAll();
radapter.openToWrite();
radapter.deleteAll();
uadapter.openToWrite();
uadapter.deleteAll();
try
{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://xxxxxxxxxxxxxxxxxxxxx");
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
json = sb.toString();
} catch (Exception e) {
Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG).show();
}
try {
jObj = new JSONObject(json);
contacts = jObj.getJSONArray("get");
for(int i = 0; i < contacts.length(); i++){
JSONObject c = contacts.getJSONObject(i);
if(!c.isNull("rname"))// || c.getString("rcode").equals(null))
{
rname = c.getString("rname");
rcode = c.getString("rcode");
radapter.insert(rcode, rname);
}
else
{
rname = "";
rcode = c.getString("rcode");
radapter.insert(rcode, rname);
}
}
Toast.makeText(getBaseContext(), " Ryot BackUp completed", Toast.LENGTH_SHORT).show();
} catch (JSONException e) {
Toast.makeText(getBaseContext(), "Error"+e.toString(), Toast.LENGTH_LONG).show();
}
progressDialog.dismiss();
}
}.start();
adapter.deleteAll();
oadapter.deleteAll();
e2.setText("Back Up completed");
}
catch (Exception e) {
Log.e("tag", e.getMessage());
}
progressDialog.dismiss();
}
}.start();
}
});
当我运行我的应用程序时,进度条仅显示几秒钟,并且执行了Catch块,显示logcat错误为
Logcat:
02-26 14:26:07.151: E/tag(301): Can't create handler inside thread that has not called Looper.prepare()
有人可以解释我的代码中的错误是什么以及如何解决它
Toast.makeText(getBaseContext(), " Ryot BackUp completed", Toast.LENGTH_SHORT).show();
问题是由上面的代码引起的,此方法将更改UI,您不能在非UI线程中更新UI。 因此,您需要从主ui线程调用它。
由于这是一项耗时的工作,因此我强烈建议您在Android中使用AsyncTask 。
但是,如果您只想对现有代码进行一些更改,请尝试使用
context.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(...).show();
}
});
或处理程序,您可以查看Android中处理程序的工作方式 。 一个基本的例子:
public Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
//show toast here
}
}
protected void startLongRunningOperation() {
Thread t = new Thread() {
public void run() {
//do something here
//update the result
mHandler.postDelayed(mUpdateResults, 200);}
mHandler.post(mUpdateResults);
}
};
t.start();
}
而不是创建新的线程,而是创建一个HandlerThread- http://developer.android.com/reference/android/os/HandlerThread.html
只需将“ new Thread()”替换为“ new HandlerThread(“ any string”)“,它就可以工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.