正如标题所暗示的那样 - 我已经对这个主题进行了大量研究,但我仍然感到困惑,无法实现我想要的目标。
在非常简化的场景中,我有一个LoginActivity,其中是方法boolean validateUserInput(String mail, String password)
,我想在单独的线程中进行检查输入。我想我将来会扩展它以进行登录(http请求)。当然,如果操作成功与否,我想获得布尔值 - 并且在操作过程中我想显示进度条对话框。
制作一个帖子,运行代码,返回结果,同时显示进度条,小蛋糕吧?
我应该使用asynctask还是runnable?我该怎么做,所以我不阻止UI线程?
这是我尝试在LoginActivity中使用的代码:
new Thread(new Runnable() {
@Override
public void run() {
mUserInputValidated = validateUserInput(inputEmail.getText().toString(), inputPassword.getText().toString());
}
}).start();
if(mUserInputValidated)
{
attemptUserLogin(inputEmail.getText().toString(), inputPassword.getText().toString());
}
我也尝试过asynctask方法,但最后出现了各种错误,因为我在onPreExecute()
开始进度对话并在onPostExecute()
中结束,使用类似LoginActivity.this
的引用,其中存在内存问题泄漏,我也无法解决?
我认为这是非常常见的情况,因为几乎每个应用都使用它,所以 - 常见的方法是什么?如何修复代码?
答案 0 :(得分:0)
你必须使用 asynctask 这将从主线程中删除工作,并在工作完成后将其放在后台线程上
这是一个展示如何操作的示例
private class LongOperation extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.interrupted();
}
}
return "Executed";
}
@Override
protected void onPostExecute(String result) {
TextView txt = (TextView) findViewById(R.id.output);
txt.setText("Executed"); // txt.setText(result);
// might want to change "executed" for the returned string passed
// into onPostExecute() but that is upto you
}
@Override
protected void onPreExecute() {}
@Override
protected void onProgressUpdate(Void... values) {}
}