首页 文章

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

提问于
浏览
1

我正试图在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 回答

  • 4

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

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

    将抛出异常 .

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


    要"fix",您需要仔细阅读并理解AsyncTask实现 . 不是通过 AsyncTask<Void, Void, Void> 声明后台任务,而是可以提供"result type",可以将 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;
    }
    

相关问题