下面是一个登录活动,它与服务器连接以执行登录操作,所以为了在后台线程中做如何正确使用Asynctask的方法?
我是android的新手,之前没有使用Asynctask,但我看过教程仍然无法自己做
//公共类LoginActivity扩展AppCompatActivity扩展Asynctask显示一些错误
编辑:错误在这里 //公共类LoginActivity扩展了AsyncTask扩展 AppCompatActivity {({expected)
public class LoginActivity extends AppCompatActivity{
private TextView tvLFS, tvOr;
private Button btnLog;
private EditText etUn, etPw;
private static final String TAG = "LoginActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//remove action bar
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.hide();
}
//change font of the heading
tvLFS = (TextView) findViewById(R.id.tvHeadingLFS);
Typeface typeface =
Typeface.createFromAsset(getAssets(),
"fonts/futuramediumitalicbt.ttf");
tvLFS.setTypeface(typeface);
init();
}
private void init() {
tvLFS = (TextView) findViewById(R.id.tvHeadingLFS);
tvOr = (TextView) findViewById(R.id.tvOR_LOGIN_USING);
btnLog = (Button) findViewById(R.id.btnLogin);
etUn = (EditText) findViewById(R.id.etUName);
etPw = (EditText) findViewById(R.id.etPass);
/* SharedPreferences pref = getSharedPreferences("ActivityPREF",
Context.MODE_PRIVATE);
SharedPreferences.Editor edt = pref.edit();
edt.putBoolean("activity_executed", true);
edt.commit();*/
btnLog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
final String usname = etUn.getText().toString();
final String uspass = etPw.getText().toString();
final LoginRequest loginRequest = new LoginRequest();
loginRequest.setClientType("mobile");
loginRequest.setMsService("login");
loginRequest.setMsServiceType("user-management");
List<LoginRequest.MsDataLogin> msDataLogList = new
ArrayList<>();
LoginRequest.MsDataLogin msData =
loginRequest.getMsDAtaLoginInstance();
msData.setUserName(usname);
msData.setUserPass(uspass);
msDataLogList.add(msData);
loginRequest.setMsData(msDataLogList);
RestClient.getApiInterface().postData(loginRequest).enqueue(new
ResponseResolver<LoginResponse>(LoginActivity.this) {
@Override
public void success(LoginResponse loginResponse) {
if (loginResponse.getErrorCode().equals("0"))
{
Toast.makeText(LoginActivity.this,
"Logged-in successfully!!", Toast.LENGTH_SHORT).show();
Intent in = new
Intent(getApplicationContext(), MainActivity.class);
startActivity(in);
finish();
} else
if(loginResponse.getErrorCode().equals("1")){
Toast.makeText(LoginActivity.this, "No
account found!! Please register", Toast.LENGTH_LONG).show();
}
}
@Override
public void failure(APIError error) {
Log.d(TAG, "failure: error--
"+error.getMessage());
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
答案 0 :(得分:2)
根据您的编辑,您是否尝试扩展两个课程?那么,(我认为)在Java中是不可能的......
回到你关于AsyncTask的问题。对于某些场景,AsynTask用于在主线程/ UI线程之外创建任务(例如:基本的,在执行某些工作时不锁定UI),因此您无法在AsyncTask中与UI进行交互甚至混合两种东西(在某些情况下是可能的,但不推荐)。
所以你需要在其他类中扩展AsyncTask而不是你的视图/活动(另一个Class.java或嵌套/内部类),例如:
public class MyAsyncTask extends AsyncTask<ParameterType, ProgressType, ReturnType> {
//Example to demonstrate UI interation
private IView view;
public MyAsyncTask(IView view) {
this.view = view;
}
@Override
protected ReturnType doInBackground(ParameterType... params) {
// do and update the work
return new ReturnType(); // work is done, return the result
}
// Override this method if you need to do something after the AsyncTask has finished (based on the return). Here you can interact with the UI too.
@Override
protected void onPostExecute(ReturnType o) {
// Example of UI interaction
view.updateUI(o);
}
}
如果您不需要参数,返回或更新AsyncTask的进度,您可以使用&#39; Void&#39;输入TypeType,ProgressType或ReturnType。
然后你可以在其他类(例如你的活动)中创建一个MyAsyncTask的函数,调用'execute()'方法来启动AsyncTask。
public class Foobar extends AppCompatActivity implements IView {
... code ...
MyAsyncTask fooTask = new MyAsyncTask(this); // Foobar class needs to implement IView interface
fooTask.execute(parameters); // execute AsyncTask with 'parameters'
... code ...
}
根据您的代码,您尝试拨打网络电话。因此,您需要将网络电话迁移到内部&#39; doInBackground&#39;方法,并在&#39; onPostExecute&#39;中调用下一个活动(或显示错误)。
我对你的实现(RestClient,ResponseResolver)不太熟悉,但我认为你可以使用Retrofit / Jackson库来获得更加可靠的解决方案。它们不是很难理解,也使网络呼叫更容易。
在下面的参考资料中,您可以使用其他替代方法而不是AsyncTask。
以下是一些参考资料:
https://developer.android.com/reference/android/os/AsyncTask.html https://developer.android.com/guide/components/processes-and-threads.html
良好的编码。