无法将值传递给Android中的AsyncTask

大道之行,天下为公。这篇文章主要讲述无法将值传递给Android中的AsyncTask相关的知识,希望能为你提供帮助。
【无法将值传递给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"}}


    推荐阅读