嗨,我的代码有问题。我的代码是
progressD = ProgressDialog.show(MenuUtama.this, "", "Uploading files to server.....", false);
Thread thread = new Thread(new Runnable(){
public void run(){
//doFileUpload();
try {
// setiap parameter yang akan dikirim melalui http
// harus encode agar
// dapat terbaca dengan baik oleh server
Cursor c = helper.getAll1(almagId);
Cursor cr = helper.getUpImage(almagId);
if(c.moveToFirst()){
//progressD = ProgressDialog.show(context, title, message)
do{
String kdstore = URLEncoder.encode(helper.getKdStore(c).toString(), "utf-8");
String nama = URLEncoder.encode(helper.getNama(c).toString(), "utf-8");
String alamat = URLEncoder.encode(helper.getAlamat(c).toString(), "utf-8");
String kdpos = URLEncoder.encode(helper.getKdPos(c).toString(), "utf-8");
String notelp = URLEncoder.encode(helper.getNotel(c).toString(), "utf-8");
String lng = URLEncoder.encode(helper.getlng(c).toString(), "utf-8");
String lat = URLEncoder.encode(helper.getLat(c).toString(), "utf-8");
String perush = URLEncoder.encode(helper.getPerus(c).toString(), "utf-8");
//String gambar = URLEncoder.encode(helper.getGamb(c).toString(), "utf-8");
//Toast.makeText(this, kdstore, Toast.LENGTH_LONG).show();
//System.out.println(gambar);
url += "?kode_toko=" + kdstore + "&&nama=" + nama + "&&alamat=" + alamat +
"&&kode_pos=" + kdpos + "&&no_telp=" + notelp + "&&longitude=" + lng + "&&latitude=" + lat +
"&&perusahaan=" + perush;
getRequest(url);
url = "http://10.234.165.232/upload_get.php";
}while(c.moveToNext());
}
if(cr.moveToFirst()){
do{
String kdstore = URLEncoder.encode(helper.getKdstore1(cr), "utf-8");
String gambar = URLEncoder.encode(helper.getGam1(cr), "utf-8");
url1 += "?kode_toko1=" + kdstore + "&&gambar1=" + gambar;
getRequest1(url1);
url1 = "http://10.234.165.232/upload_get2.php";
}while(cr.moveToNext());
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
MenuUtama.this.runOnUiThread(new Runnable(){
public void run() {
if(progressD.isShowing())
progressD.dismiss();
}
});
}
});
thread.start();
return(true);
和这样的错误:
FATAL EXCEPTION: Thread-9
java.lang.RuntimeException:
Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:121)
at android.widget.Toast.<init>(Toast.java:68)
at android.widget.Toast.makeText(Toast.java:231)
at com.sat.alfaloc.MenuUtama.getRequest(MenuUtama.java:160)
at com.sat.alfaloc.MenuUtama$1.run(MenuUtama.java:101)
at java.lang.Thread.run(Thread.java:1096)
如果活动将数据保存到服务器我命令进度条可以运行,但如果没有这不起作用..我应该怎么做才能解决这个问题?
答案 0 :(得分:13)
由于您正在使用活动上下文的主题,可能会收到错误。
您应该使用AsyncTask而不是普通的帖子。
在AsyncTask中,有一个方法onPreExecute()
和onPostExecute()
在主线程上执行,并且有一个方法doInBackground()
将在后台执行,以便您可以轻松实现长期过程。
您可以参考this example
答案 1 :(得分:5)
有时即使违规代码在Activity内部(例如在使用Unity游戏引擎的情况下),您也可能会遇到此问题。
以下代码对我有用。
this.runOnUiThread(new Runnable() {
public void run() {
//Your code here
...
}
});
答案 2 :(得分:4)
在UI线程上运行指定的操作
ActivityName.runOnUiThread(new Runnable() {
public void run() {
//put your code here
}
});
答案 3 :(得分:2)
当您使用AsyncTask并且正在doInBackground线程中运行进程时 您无法执行Toast等功能,例如打开新片段。
当您遇到此特定错误时,请尝试使用此代码创建一个新线程来运行您的代码。它将它带到前台,而不是后台进程(据我所知)。
对于碎片:
getActivity().runOnUiThread(new Runnable()
{
public void run()
{
// Send Toast
Toast.makeText(getActivity(), "Your Message!", Toast.LENGTH_SHORT).show();
}
});
活动:
this.runOnUiThread(new Runnable()
{
public void run()
{
// Send Toast
Toast.makeText(this, "Your Message!", Toast.LENGTH_SHORT).show();
}
});
两者之间的区别仅在于您是在调用this
还是getActivity()
来运行您的线程。无论哪种方式,它们都会在正在运行的活动上创建一个新线程。
我希望有所帮助!
哦,作为一个注释,在AsyncTask中可以创建自己的函数,例如:
protected void myTaskFunction() throws exception
{
// Stuff to do
}
在这些函数中,这是AsyncTask类的一部分,这是您放置runOnUiThread()
段代码的地方。希望这更清楚。