其他分享
首页 > 其他分享> > android-如果将AsyncTask声明为Activity的内部类或在单独的文件上,为什么行为会有所不同?

android-如果将AsyncTask声明为Activity的内部类或在单独的文件上,为什么行为会有所不同?

作者:互联网

我正在使用一个名为Sugar的Android ORM将模型保留在数据库中,并且
我在AsyncTask中使用它.

这是它的声明:

public class LoginTask extends AsyncTask<Object, Integer, String> {

    private Context context;
    private ProgressDialog progressDialog;

    public LoginTask(Context context) {
        this.context = context;
    }

    @Override
    protected void onPreExecute() {
        progressDialog = new ProgressDialog(context) {
            {
                setMessage("Authenticating...");
                setTitle("Login");
                setCancelable(false);
                setIndeterminate(true);
                show();
            }
        };
    }

    @Override
    protected String doInBackground(Object... params) {
        String email = (String) params[0];
        String password = (String) params[1];

        try {
            User user = LoginWebService.loginUser(email, password,
                    context);
            user.save();
        } catch (CommunicationException e) {
            e.printStackTrace();
            return e.getMessage();
        }

        return null;
    }

    @Override
    protected void onPostExecute(final String result) {
        progressDialog.dismiss();
    }
}

上面的user.save()行将用户模型保存在db中,这是导致异常的行.奇怪的是,如果我将上面的任务声明为活动的内部类,则可以正常工作,但是如果我将任务声明为单独的文件,则会抛出此异常:

E/AndroidRuntime(17172):    at com.app.task.LoginTask.doInBackground(LoginTask.java:47)
E/AndroidRuntime(17172):    at com.app.task.LoginTask.doInBackground(LoginTask.java:1)
E/AndroidRuntime(17172):    at android.os.AsyncTask$2.call(AsyncTask.java:264)
E/AndroidRuntime(17172):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
E/AndroidRuntime(17172):    ... 5 more
E/AndroidRuntime(17172): Caused by: java.lang.RuntimeException: Cant create handler inside thread that has not called Looper.prepare()

我看不到有什么区别,因为我看不到任何意义.

解决方法:

您正在尝试从后台线程访问/更新UI.在log cat的最后一句中引发的异常表示“这些”类型的交互.如果它是活动的内部类,这也会崩溃.

证明是您通过了上下文.另一个问题,因为那也可能是问题.这是活动的上下文还是AsyncTask的上下文?它需要什么环境?

标签:android-asynctask,android
来源: https://codeday.me/bug/20191201/2077734.html