Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
应用程序在实现异步Android时崩溃_Android_Asynchronous - Fatal编程技术网

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

应用程序在实现异步Android时崩溃,android,asynchronous,Android,Asynchronous,我试图在Android上实现async,但它一直在破坏我的应用程序,如果我将doInBackground中的代码放在oncreate中,我知道它可以工作 非常感谢您的帮助 谢谢 这是我的密码: public class accueilEco extends Activity { String[] param = new String[5]; TextView nom; TextView prenom; ProgressDialog mDialog; Context ctxt; Telephony

我试图在Android上实现async,但它一直在破坏我的应用程序,如果我将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;
    }


}
公共类accueilEco扩展活动
{
字符串[]参数=新字符串[5];
文本视图名称;
TextView prenom;
进步对话;
上下文ctxt;
TelephonyManager tm;
连接性;
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
nom=(TextView)findViewById(R.id.user);
ctxt=getBaseContext();
tm=(电话管理器)getSystemService(电话服务);
新建chargerParam().execute();
}
公共类chargerParam扩展异步任务{
@凌驾
受保护的void onPostExecute(void结果){
//TODO自动生成的方法存根
}
@凌驾
受保护的void onPreExecute(){
//TODO自动生成的方法存根
}
@凌驾
受保护的Void doInBackground(Void…参数){
尝试
{
ce=新的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);
名称setText(参数[1]+“”+参数[2]+“-”+参数[3]);
}
其他的
{
Toast.makeText(ctxt,“=>login”,Toast.LENGTH_LONG.show();
}
}
捕获(例外情况除外)
{
Toast.makeText(ctxt,“erreur”,Toast.LENGTH_LONG).show();
}
返回null;
}
}

}

您不能从UI线程以外的其他线程访问UI对象。守则:

nom.setText(param[1]+" "+ param[2]+" - "+param[3]);
将抛出异常

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


要“修复”这个问题,您需要通读并理解实现。您可以提供一个“结果类型”,而不是通过
AsyncTask
声明后台任务,该类型可以从
doInBackground
方法发布到
onPostExecute
方法(在UI线程上)<代码>异步任务(字符串类型)

您必须执行以下操作:

@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;
}

不能从UI线程以外的其他线程访问UI对象。守则:

nom.setText(param[1]+" "+ param[2]+" - "+param[3]);
将抛出异常

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


要“修复”这个问题,您需要通读并理解实现。您可以提供一个“结果类型”,而不是通过
AsyncTask
声明后台任务,该类型可以从
doInBackground
方法发布到
onPostExecute
方法(在UI线程上)<代码>异步任务(字符串类型)

您必须执行以下操作:

@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;
}

请在问题中添加日志。这将更快地提出问题。请在问题中添加日志。这会很快出现问题。我检查了,但我不确定,我应该在postExecute方法中放置gui“更新”否?@Mike Bryant:是的,不要在
doInBackground
方法中触摸UI元素。请参阅我提供的示例。编辑:祝酒必须进入我选中的post execute Too,但我不确定,我应该在postExecute方法中放入gui“更新”否?@Mike Bryant:是的,不要在
doInBackground
方法中触摸UI元素。请参阅我提供的示例。编辑:祝酒词也必须放在post execute中