Android:如何为下面的类正确实现Asynctask?

Android:如何为下面的类正确实现Asynctask?,android,android-asynctask,Android,Android Asynctask,下面是一个登录活动,它与服务器连接以执行登录操作,所以要在后台线程中执行此操作,如何正确使用Asynctask的方法 我是android新手,以前没有使用过Asynctask,但我看过一些教程,但我自己还是做不到 //公共类LoginActivity extends AppCompatActivity extends Asynctask显示一些错误 编辑:此处有错误 //公共类LoginActivity扩展异步任务扩展 AppCompative活动{({应为) 公共类LoginActivity扩

下面是一个登录活动,它与服务器连接以执行登录操作,所以要在后台线程中执行此操作,如何正确使用Asynctask的方法

我是android新手,以前没有使用过Asynctask,但我看过一些教程,但我自己还是做不到

//公共类LoginActivity extends AppCompatActivity extends Asynctask显示一些错误

编辑:此处有错误 //公共类LoginActivity扩展异步任务扩展 AppCompative活动{({应为)

公共类LoginActivity扩展了AppCompatActivity{
专用文本视图tvLFS、tvOr;
专用按钮btnLog;
私人编辑文本etUn,etPw;
私有静态最终字符串TAG=“LoginActivity”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u登录);
//移除操作条
ActionBar ActionBar=getSupportActionBar();
if(actionBar!=null){
actionBar.hide();
}
//更改标题的字体
tvLFS=(TextView)findViewById(R.id.TVLheadingLFS);
字体字体=
Typeface.createFromAsset(getAssets(),
“fonts/FuturaMediumitalibt.ttf”);
设置字体(字体);
init();
}
私有void init(){
tvLFS=(TextView)findViewById(R.id.TVLheadingLFS);
tvOr=(TextView)findViewById(R.id.tvOr\u LOGIN\u USING);
btnLog=(按钮)findViewById(R.id.btnLogin);
etUn=(EditText)findViewById(R.id.etUName);
etPw=(EditText)findViewById(R.id.etPass);
/*SharedReferences pref=GetSharedReferences(“ActivityPREF”,
上下文。模式(私人);
SharedReferences.Editor edt=pref.edit();
edt.putBoolean(“已执行的活动”,真);
提交()*/
btnLog.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
试一试{
最后一个字符串usname=etUn.getText().toString();
最后一个字符串uspass=etPw.getText().toString();
最终登录请求LoginRequest=新登录请求();
loginRequest.setClientType(“移动”);
loginRequest.setMsService(“登录”);
loginRequest.setmserviceType(“用户管理”);
列表msDataLogList=新建
ArrayList();
LoginRequest.MsDataLogin msData=
loginRequest.getMsDAtaLoginInstance();
msData.setUserName(usname);
msData.setUserPass(uspass);
添加(msData);
loginRequest.setMsData(msDataLogList);
RestClient.getApiInterface().postData(loginRequest).enqueue(新
ResponseResolver(LoginActivity.this){
@凌驾
public void success(LoginResponse LoginResponse){
if(loginResponse.getErrorCode().equals(“0”))
{
Toast.makeText(LoginActivity.this,
“成功登录!!”,Toast.LENGTH\u SHORT.show();
意图在=新
意图(getApplicationContext(),MainActivity.class);
星触觉(in);
完成();
}否则
如果(loginResponse.getErrorCode().equals(“1”)){
Toast.makeText(LoginActivity.this)表示“否
找到帐户!!请注册“,Toast.LENGTH\u LONG).show();
}
}
@凌驾
公共无效失败(APIRERROR错误){
Log.d(标记“失败:错误--”
“+error.getMessage());
}
});
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
}

基于您的编辑,您正在尝试扩展两个类?嗯,(我认为)这在Java中是不可能的

回到您关于AsyncTask的问题。AsynTask用于在某些情况下(例如:基本,在执行某些工作时不锁定UI)使任务位于de主线程/UI线程之外,因此,您无法在AsyncTask中与UI交互,甚至无法混合这两种情况(在某些情况下是可能的,但不推荐)

因此,您需要在视图/活动之外的其他类(另一个class.java或嵌套/内部类)中扩展AsyncTask,示例如下:

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);
    }
}
根据您的代码,您正在尝试进行网络调用。因此,您需要将网络调用迁移到“doInBackground”方法中,并在“onPostExecute”中调用下一个活动(或显示错误)

我对您的实现(RestClient、ResponseResolver)不太熟悉,但我认为您可以使用Reformation/Jackson库来获得更可靠的解决方案。它们不太难理解,并且使网络调用更容易

在下面的参考中,您可以使用其他替代方案来代替异步任务

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 ...
}
以下是一些参考资料:


很好的编码。

如果你想让我们帮助你,你需要发布错误。我已经编辑了错误,我认为语法是错误的,但我不确定我还有一个问题!现在我必须使用来自EditText(即usname和uspass)的输入,如何将其作为参数传递到doInBackground?这样我就可以在doInBackground中执行rest操作您可以传递输入(从EditText获取字符串)作为AsyncTask的变量(通过构造函数、setter传递)或使用字符串(或映射/哈希映射)作为ParameterType(如果您不熟悉“Type…variable”表示法,这意味着可选的“vector”变量[参数/参数],因此接受零个或多个值。Doc:),因此您可以直接传递“execute()方法调用。
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 ...
}