大道之行,天下为公。这篇文章主要讲述无法将值传递给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
无法获得值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 Studio - 对象构造函数中的NetworkOnMainThreadException
- AsyncTask Android方法的技术差异
- Android AsyncTask问题(连接到Web服务)
- Android(Kotlin) - 如何等待异步任务完成()
- E / AndroidRuntime(致命异常:Android的AsyncTask#1 ERROR)
- Android AsyncTask无法运行
- AsyncTask在android中加载数据的次数非常不同
- Android Socket,AsyncTask,Handler内存泄漏
- 示例(使用AsyncTask的Android双向网络套接字)