线程出错

时间:2014-09-04 16:13:40

标签: android android-activity

我在使用线程进行互联网资源时遇到错误。

我在logcat中收到此错误:

   09-04 21:05:32.916    1480-1493/abc.digicare.sms1 E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-78
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$TN.<init>(Toast.java:317)
        at android.widget.Toast.<init>(Toast.java:91)
        at android.widget.Toast.makeText(Toast.java:233)
        at abc.digicare.sms1.MyActivity$1.run(MyActivity.java:45)
        at java.lang.Thread.run(Thread.java:856)

我的代码是这样的:通过点击按钮调用此函数。

   public void GetData(View v) {
    Toast.makeText(getApplicationContext(), "first", Toast.LENGTH_SHORT).show();
    p=ProgressDialog.show(getApplicationContext(),"Digicare","Wait . . .");

    try {
        Runnable myrun = new Runnable() {
            @Override
            public void run() {

                String acc = "";
                if (chckbx_cus.isChecked() && !(chckbx_ven.isChecked()) && !(chckbx_emp.isChecked())) {
                    acc = "cus";
                } else if (chckbx_ven.isChecked() && !(chckbx_cus.isChecked()) && !(chckbx_emp.isChecked()))

                Toast.makeText(getApplicationContext(), acc, Toast.LENGTH_SHORT).show();

                final String facc = acc;

                GetList GL = new GetList();
                //Toast.makeText(getApplicationContext(),txt_ip.getText(),Toast.LENGTH_SHORT).show();
                obj = GL.GetAccounts(getApplicationContext(), facc, "GetAccounts", "192.168.1.111");
                mhandler.sendEmptyMessage(0);
            }

        };
        Thread th = new Thread(myrun);
        th.start();

    } catch (Exception e) {
        Toast.makeText(getApplicationContext(), "from here  " + e.toString(), Toast.LENGTH_LONG).show();
    }

    mhandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            p.dismiss();
        }
    };
}

从其他类调用的函数用于从asp.net Web服务获取数据

1 个答案:

答案 0 :(得分:0)

您似乎正在尝试从后台线程显示Toast。在try-catch块之前移动Handler创建代码并使用final修饰符,以便您可以从Runnable中访问处理程序。然后在runnable调用中

mhandler.post(new Runnable() {
    public void run() {
        Toast.makeText(getApplicationContext(), acc, Toast.LENGTH_SHORT).show();
    }
});