无法将值传递给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
无法获得值passLogin
或strUserName
(Toast.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的主要内容,如果未能解决你的问题,请参考以下文章
如何将值从基本适配器传递到 Android 中的 Activity