【问题标题】:How to call an asyncTask to an outside service from within a fragment如何从片段内调用 asyncTask 到外部服务
【发布时间】:2019-07-22 00:50:28
【问题描述】:

“我正在尝试通过片段中的另一个类中的 asyncTask 调用外部服务。我的 IDE 告诉我它无法从我的片段中执行 getInstance 方法。但是我继续这样做,我最终需要调用Async ClarafaiPutImagesInModel类的doInBackground()方法。

我尝试让我周围的班级成为单身人士,但要么这样做不正确,要么这不是解决问题的方法。

这是片段中的方法:

  private void endOfTutorial(ResponseViewModel viewModel, View view) {
    Snackbar snackbarNo12 = Snackbar
        .make(view, getString(R.string.tutorial_no12), Snackbar.LENGTH_LONG);
    snackbarNo12.show();
    try {
      Thread.sleep(1000);
      if (malingeringCount > 2) {
        Snackbar snackbarNo13 = Snackbar
            .make(view, getString(R.string.tutorial_no13), Snackbar.LENGTH_LONG);
        snackbarNo13.show();
        Thread.sleep(1000);
        tutorialPosition = 0;
      } else {
        Snackbar snackbarNo14 = Snackbar
            .make(view, getString(R.string.tutorial_no14), Snackbar.LENGTH_LONG);
        snackbarNo14.show();
        sandwich.setHumanEat(false);
        viewModel.updateHumanEat(sandwich);
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putBoolean(getString(R.string.saved_tutorial_complete_key), true);
        editor.apply();
        tutorialPosition++;
        viewModel.pruneTutorial();
        Thread.sleep(1000);
        LiveData<List<Sandwich>> feedClarafi = viewModel.getSandwichForModel();
        ClarafaiService.ClarifaiPutImagesInModel modelMaker = new ClarafaiService.getInstance().ClarifaiPutImagesInModel();
        modelMaker.execute(feedClarafi);
      }
    } catch (InterruptedException exc) {
      System.out.println(exc);
    }
    Navigation.findNavController(getActivity(), R.id.nav_host_fragment)
        .navigate(R.id.action_responseFragment_to_sandwichImageFragment);
  }

这是有问题的班级:

public class ClarafaiService {


  private static final double CONFIDENCE_THRESHOLD = 0.50;
  private String modelId;
  private boolean trained;
  private String modelVersionId;
  private static ClarafaiService SOLEINSTANCE;


  final ClarifaiClient client = new ClarifaiBuilder("APIKEY")
      .client(new OkHttpClient.Builder()
          .connectTimeout(60, TimeUnit.SECONDS)
          .readTimeout(60, TimeUnit.SECONDS)
          .writeTimeout(60, TimeUnit.SECONDS)
          .addInterceptor(new HttpLoggingInterceptor())
          .build()
      )
      .buildSync();

  private ClarafaiService(){}

  public static ClarafaiService getInstance(){
    if(SOLEINSTANCE == null){
      SOLEINSTANCE = new ClarafaiService();
    }
    return SOLEINSTANCE;
  }





  public class ClarifaiPutImagesInModel extends
      AsyncTask<Sandwich, Void, ClarifaiResponse<List<ClarifaiInput>>> {


    @Override
    protected ClarifaiResponse<List<ClarifaiInput>> doInBackground(Sandwich... sandwiches) {
      List<ClarifaiInput> inputs = new LinkedList<ClarifaiInput>();
      for (Sandwich sandwich : sandwiches) {
        ClarifaiInput input = ClarifaiInput.forImage(sandwich.getFileName())
            .withConcepts(Concept.forID("sandwich"));
        inputs.add(input);
      }
      return client.addInputs()
          .plus(inputs)
          .executeSync();
    }

    @Override
    protected void onPostExecute(ClarifaiResponse<List<ClarifaiInput>> response) {
      if (response.isSuccessful()) {
        new ClarafaiCreateModel().execute();
      } else {
       //TODO figure out how to show a snackbar/toast without reference to a view
      }
    }
  }

//There are more classes below this but they are moot if I can't call this first one.

我希望 Clarafai 回复我的图像已成功输入,但我却被告知它不能调用方法 getInstance()。

【问题讨论】:

    标签: java android android-fragments android-asynctask


    【解决方案1】:

    编辑

    抱歉,实际的解决方案是将static 关键字添加到ClarifaiPutImagesInModel,如下所示:

    public static class ClarifaiPutImagesInModel extends AsyncTask<Sandwich, Void, ClarifaiResponse<List<ClarifaiInput>>> {


    您在尝试初始化 ClarifaiPutImagesInModel 时遇到的问题是您不需要在您的服务上调用 getInstance。在调用getInstance 时,您试图通过服务类的实例创建一个新的ClarifaiPutImagesInModel

    这一行:

    ClarafaiService.ClarifaiPutImagesInModel modelMaker = new ClarafaiService.getInstance().ClarifaiPutImagesInModel();

    改为:

    ClarafaiService.ClarifaiPutImagesInModel modelMaker = new ClarafaiService.ClarifaiPutImagesInModel();

    顺便说一句,我鼓励您进一步探索 Android 和 Java 约定,AsyncTask 是用于异步工作的过时 API,并且有许多新的第一方 Android 工具以及第三方库来完成异步工作以一种更简洁且不易出错的方式。

    【讨论】:

    • 谢谢,伊莱。我期待着扩展我的工具集。但是,当我调用 ClarafaiService.ClarifaiPutImagesInModel modelMaker = new ClarafaiService.ClarifaiPutImagesInModel();我收到错误:package.ClarafaiService 不是封闭类。对此有什么想法吗?
    • 我已通过编辑更新了我的答案。看来您对 Java 类/文件结构的工作方式有一些误解,我鼓励您阅读一些有关此的基本 Java 教程,因为这对您有很大帮助。
    • 再次感谢您,Eli。然而,ClarifaiService 类的右括号位于第 192 行,未包含在我的帖子中,它实际上包括所有后续的嵌套类。我将分解服务类。
    • 你指的是私有 ClarifaiService 构造函数吗?您是否建议我将所有嵌套类都包含在内?
    • 道歉,方向错误(虽然它会起作用)您需要在 ImagesInModel 类的声明中添加 static 关键字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 2018-06-14
    相关资源
    最近更新 更多