应用程序在实现异步Android时崩溃

时间:2012-01-26 11:30:16

标签: android asynchronous

我正在尝试在Android上实现异步,但它不断崩溃我的应用程序,doInBackground中的代码可以工作,如果我把它放在oncreate中,以便我知道它的工作原理 任何帮助是极大的赞赏 感谢

这是我的代码:

public class accueilEco extends Activity
{
String[] param = new String[5];
TextView nom;
TextView prenom;
ProgressDialog mDialog;
Context ctxt;
TelephonyManager tm;
connectEco ce;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    nom = (TextView) findViewById(R.id.user);
    ctxt = getBaseContext();
    tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    new chargerParam().execute();

}
public class chargerParam extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub

    }

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub

    }

    @Override
    protected Void doInBackground(Void... params) {

        try
        {
            ce =new connectEco();

            param = ce.recupereParam(tm.getDeviceId());

            if(String.valueOf(param[4]) == String.valueOf(1))
            {
                Toast.makeText(ctxt, "Paramétres chargées" , Toast.LENGTH_LONG).show();
                //setContentView(R.layout.home);
                nom.setText(param[1]+" "+ param[2]+" - "+param[3]);

            }
            else
            {
                Toast.makeText(ctxt, "=> login" , Toast.LENGTH_LONG).show();
            }


        }
        catch(Exception ex)
        {
            Toast.makeText(ctxt, "erreur" , Toast.LENGTH_LONG).show();
        }

        return null;
    }


}

}

1 个答案:

答案 0 :(得分:4)

您无法从UI线程以外的其他线程访问UI对象。代码:

nom.setText(param[1]+" "+ param[2]+" - "+param[3]);

将抛出异常。

您可以在onPreExecute()或onPostExecute(Result)中访问UI元素。在doInBackground中访问UI元素时,会导致异常。


要“修复”此问题,您需要仔细阅读并理解AsyncTask实施。您可以提供“结果类型”,而不是通过AsyncTask<Void, Void, Void>声明后台任务,可以将doInBackground方法发布到onPostExecute方法(在UI线程上)。 AsyncTask<Void, Void, String>String类型)。

你必须做这样的事情:

@Override
protected void onPostExecute(String result) {
    if (result != null)
        nom.setText(result);
    // else show toast
}

@Override
protected String doInBackground(Void... params) {

    try {
        String[] param = new connectEco().recupereParam(tm.getDeviceId());

        if (String.valueOf(param[4]) == String.valueOf(1)) 
            return param[1]+" "+ param[2]+" - "+param[3];

    } catch(Exception ex) {
        // ignore and return null
    }

    return null;
}