【问题标题】:Android Java AsyncTask work externallyAndroid Java AsyncTask 在外部工作
【发布时间】:2016-12-20 07:47:41
【问题描述】:

我是 Java/Android 新手,我来自 c#。我一直在研究它并进行测试,我发现当我执行 AsyncTask 时,主线程会继续执行,而外部任务正在执行它的工作。我什至发现我只能设置从 MainActivity 执行外部任务的异步任务。

我的问题是我想执行一个外部类,它在完成后将结果(就像 c#)带回主任务,而不在 MainActivity 中设置异步类。

所以.. 在代码中应该是这样的:

MainActivity.java

public onClickButton(View view) {
    String result = SecondaryClass.DoAsyncTask();
}

SecondaryClass.java

private class DoAsyncTask extends AsyncTask<Long, Integer, Integer> 
{
    @Override
    protected Integer doInBackground(Long... params) {
        String longString = ThirdAPIClass.GiveMeSomeCode(); //Or work here
        return lognString;
    }

    @Override
    protected void onPostExecute(String result) {
        return result; //Somehow(?)
    }
}

知道 Java/Android 中是否有类似的东西(?)

PD:我以 AsyncTask 为例,我不知道是否还有其他指令可以做同样的事情或类似的事情。

【问题讨论】:

  • 你可以有public static String result;,在onPostExecute修改它:MainActivity.result = result;,虽然在一个大的应用程序中,但不确定是否安全。

标签: java c# android android-asynctask return


【解决方案1】:

类签名:

首先要注意的是,如果您的结果是一个字符串,那么您需要将您的扩展子句更改为:

class DoAsyncTask extends AsyncTask<Long, Integer, String>

与调用活动通信:

AsyncTaskonPostExecute 签名是void,它不返回数据。最常见的做法是:

  1. 要将此类作为您的 Activity 中的内部类,并且onPostExecute 您可以在该 Activity 中调用方法。

  2. 为您的 asyncTask 类添加一个构造函数并将活动传递给它,然后使用该活动实例调用该方法。

第一种方法:

@Override
protected void onPostExecute(String result) {
        someMethodInMainActivity(result);
    }

第二种方法:

public class DoAsyncTask extends AsyncTask<Long, Integer, String> 
{
     YouActivityName  _activity;
     public DoAsyncTask(YouActivityName activity)
     {
        _activity = activity;
     }

     @Override
     protected String doInBackground(Long... params) {
        String longString = ThirdAPIClass.GiveMeSomeCode(); //Or work here
        return lognString;
     }

     @Override
     protected void onPostExecute(String result) {

        if(_activity != null) {
          _activity.someMethodInMainActivity(result);
        }
     }
}

然后你创建你的 AsynTask 使用:

new DoAsyncTask(this);

【讨论】:

  • 那么在第二个中我将在主要活动中执行另一个功能,对吧?
  • @PaulD 在第二个中,您使用构造函数将活动实例传递给 AsyncTask 类。然后,当异步工作完成时,您使用该实例在您的活动中执行一个公共方法,并将您的异步方法的result 传递给该方法。
猜你喜欢
  • 1970-01-01
  • 2017-07-21
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
相关资源
最近更新 更多