2015-01-01 132 views
-2

我试图通过使用接口来获得asynctask的结果,但是当我尝试使用该接口上的方法时,我的应用程序不断崩溃。获取AsyncTask的结果

该项目有4个java文件:MainActivity.javaSigninActivity.javaGetAvailableExam.javaAsyncResponse.java

我敢肯定,错误不在GetAvailableExam.java,因为它只是一个打印hello world的活动,所以我不打算在这里发布它的代码,我也将修剪整个代码,只发布我认为与此问题相关的代码。

MainActivity.java

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    usernameField = (EditText)findViewById(R.id.editText1); 
    passwordField = (EditText)findViewById(R.id.editText2); 
    status = (TextView)findViewById(R.id.textView6); 
    role = (TextView)findViewById(R.id.textView7); 
    method = (TextView)findViewById(R.id.textView9); 
    signinactivity.delegate = this; 
} 

public void processFinish(String output){ 
    //Toast.makeText(getApplicationContext(), output, Toast.LENGTH_LONG).show(); 
} 

SigninActivity.java

//global variables 
private TextView statusField,roleField; 
private Context context; 
private int byGetOrPost = 0; 
private String server_ip; 
private ProgressDialog progress; 
public AsyncResponse delegate=null; 

protected void onPostExecute(String result){ 
    this.statusField.setText("Login Successful"); 
    this.roleField.setText(result); 
    this.progress.dismiss(); 
    delegate.processFinish(result); 
} 

AsyncResponse.java

public interface AsyncResponse { 
    void processFinish(String output); 
} 

SigninActivity.java上的delegate.processFinish(result)是引起崩溃的一个,如果我尝试删除/注释掉该应用,该应用会正常工作。

此外我只想问为什么这段代码不起作用?

protected void onPostExecute(String result){ 
    this.statusField.setText("Login Successful"); 
    this.roleField.setText(result); 
    this.progress.dismiss(); 

    if(result=="student") { 
     context.startActivity(new Intent(context, GetAvailableExam.class)); 
    } 
} 

整个问题的关键是,如果结果令人满意打开活动,但上面的代码,如果我尝试它添加如果条件不工作。

如果有人有兴趣看到整个代码我已经张贴here

+0

那么你没有发布崩溃,但我认为它是空指针异常,因为委托为空。你为什么要操纵另一个活动的公共成员变量?这几乎肯定是设计不好的一个标志。而且由于它是一个非静态成员,你甚至在mainactivity上如何获得signinactivity的有效副本? –

+0

那么我在这里看到它作为一个公认的答案,因此我认为它会在我身上。 –

+0

使用类似这样的界面是可以接受的做事方式(参见Rajen下面的示例,了解正确的做法)。在第二个活动中使用变量不是。它封装失败,并会使你的代码难以维护。为什么你会想要把这两项活动结合在一起? –

回答

4

尝试这种方式

if(result.equals("student")) { 

用于string comparison

+0

嗯,这首先工作,但我需要解释为什么.equals和==工作不同lol –

+0

@ClonedAccnt因为'=='是一个'操作员',只能在'整数'值。因此... –

+1

哦,这就是为什么,我是一名PHP程序员,我们在数字和字符串上都使用==,但无论如何感谢您的帮助。 –

0

除了.equals()方法错误使用==作为“MD”说,你代表的方式有点奇怪。

至少,检查它不为空:

if (delegate!=null) { 
    delegate.processFinish(result); 
} 

你可能会认为“但它始终是非空”,但这是依赖于执行顺序。

总体而言,我认为会有一种更清晰的方式来消除您使用的方法。

1

考虑您的上下文的示例示例。

public class AsyncOperation extends AsyncTask<String, Void, String>{ 

    AsyncResponse delegate; //Here it is your interface instance 
    public AsyncOperation (AsyncResponse delegate){ 
     this.delegate = delegate; 
    } 


    @Override 
    protected String doInBackground(String... params) { 
     String result; 
     // Do your processing here. 
     return result; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     if (result.equals("Student")){ 
      // do your processing. 
     } 
    } 
} 

在这里,在这种方法,你将永远不会有你的界面委托null作为要传递到您的AsycnOperation构造。