无法将值传递给Android中的AsyncTask

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法将值传递给Android中的AsyncTask相关的知识,希望对你有一定的参考价值。

我在一项活动中使用AsyncTask

这是我的代码

public class MyActivity extends AppCompatActivity {


 EditText editUserNameLogin;
 EditText editPassLogin;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.login);
    //ButterKnife.bind(this);

    editUserNameLogin = (EditText) findViewById(R.id.input_username_login);
    editPassLogin = (EditText) findViewById(R.id.input_password_login);

}

public class AsyncTaskClass extends AsyncTask<String, String, String> {


    String strUserName = editUserNameLogin.getText().toString();
    String passLogin = editPassLogin.getText().toString();


    @Override
    protected void onPreExecute() {

    }

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

        Toast.makeText(MyActivity.this, passLogin, Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onPostExecute(String r) {

    }
}

但在doInBackground无法获得值passLoginstrUserNameToast.makeText(MyActivity.this, passLogin,)不显示任何文字)

答案

您无法在后台AsyncTask doInBackground方法中执行UI操作,因为AsyncTask不能与当前UI线程一起使用,它会在您初始化和执行时创建新线程。

让我用bref解释你。

当活动开始使用活动线程时,当您完成活动操作并销毁其完全从操作任务中删除时。但是当你在Activity上启动AsyncTask时,它的开始是单独的操作统计,而不依赖于你启动的活动,所以如果你在doInBackground方法中执行UI操作,以及万一Activity被破坏,你在UI上已经被活动和UI破坏了引用,它生成一个异常。因此,有必要使用当前活动线程而不是另一个后台线程。

有很多情况下你可以在AsyncTask中传递数据,我对下面的操作感到满意,它也可以帮助你。

// Pass data to AsyncTask comma separated values
new MyBackgroundTask().execute("Hello there!","How are you?");

private class MyBackgroundTask extends AsyncTask<String, Void, Void> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(String... strings) {
        String message1 = strings[0];
        String message2 = strings[1];

        Log.d("_TAG_", "First String: " + message1);
        Log.d("_TAG_", "Second String: " + message2);
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
    }
}

有关更多信息,请阅读android官方文档AsyncTask Developer Guides

另一答案

尝试在AsyncTaskClass中执行onCreate

new AsyncTaskClass().execute();  //use this method and call this in onCreate
另一答案

试试这个,在onCreate

String response="checking";
new AsyncTaskClass().execute(response);

然后创建内部类AsyncTaskClass,

 private class AsyncTaskClass extends AsyncTask<String,Void,String > {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... strings) {
        String respose1 = strings[0];
        return respose1;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);}
}
另一答案

你不能在doInBackground中显示ui操作,如果你仍然想这样做,那么在doInBackground中使用这段代码来显示吐司

runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(MainActivity.this, "", Toast.LENGTH_SHORT).show();
            }
        });

并且您还需要调用yourAsyncTaskObject.execute来启动asynctask

另一答案

我不知道你想通过这种行为到底想要达到什么目标。 但我在这里指出一些观点。首先,您无法访问后台线程中的任何UI元素。

 @Override
protected String doInBackground(String... params) {
    Toast.makeText(MyActivity.this, passLogin, Toast.LENGTH_SHORT).show();
}

上面的代码不起作用,因为doInBackground与UI线程异步运行。

如果你想在AsyncTask上开始祝酒,那就在onPreExecute或者在onPostExecute执行之后再做。

        @Override
        protected void onPreExecute() {
        Toast.makeText(MyActivity.this, passLogin, Toast.LENGTH_SHORT).show();
        }

而且,当我看到你从未执行过AsyncTask时,你对它的期望是怎样的。请致电execute()

new AsyncTaskClass().execute();

有关AsyncTask的更多信息,请阅读AsyncTask

另一答案

请尝试以下方法:

@Override
protected String doInBackground(String... params) {
runOnUiThread(new Runnable() {    
            @Override
            public void run() {
               Toast.makeText(MyActivity.this, passLogin, Toast.LENGTH_SHORT).show();    
            }
    });            
}
另一答案

AsyncTask可以正确,轻松地使用UI线程。此类允许您执行后台操作并在UI线程上发布结果,而无需操作线程和/或处理程序。

new AsyncTaskClass("SEND STRING").execute();

你可以通过这种方式传递你的价值

private class AsyncTaskClass extends AsyncTask<String, String, String> {

    String strRESPONSE="";

    public MyAsyncTask(String str_GET) {
         this.strRESPONSE=str_GET; // print "SEND STRING"

    }


}

以上是关于无法将值传递给Android中的AsyncTask的主要内容,如果未能解决你的问题,请参考以下文章

无法将值传递给 mvc 5 中的内部类属性

通过 AsyncTask 将值从第一个活动传递到第三个活动

Vue组件中的jQuery插件:无法将值传递给prop

如何将值从基本适配器传递到 Android 中的 Activity

如何将值从活动传递到 Android Studio 中的类?

Android:在 AsyncTask 中传递字符串参数?