AsyncTask 的 onPostExecute 方法获取相同的参数

Posted

技术标签:

【中文标题】AsyncTask 的 onPostExecute 方法获取相同的参数【英文标题】:AsyncTask's onPostExecute method gets the same parameters 【发布时间】:2019-02-07 20:07:44 【问题描述】:

我有一个 CardsParser 类,它解析网页并返回一个带有 WordCard 对象的 ArrayList。然后对象显示在 TextView 中。

第一个请求总是可以的。但后来我得到了和第一次一样的结果。我的 TextView 清除,新请求运行,我总是从第一个 ArrayList 获取对象。

我发现 onPostExecute 方法总是获取相同的 ArrayList 作为参数,但我不知道为什么,因为我每次都创建新的 CardsParser 和 doInBackground 方法得到正确的参数。

提前致谢。

public class MainActivity extends AppCompatActivity implements View.OnClickListener 

EditText editText;
Button srchBtn;
TextView foundWords;
CardsParser cardsParser;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    editText = findViewById(R.id.editText);
    srchBtn = findViewById(R.id.srchBtn);
    srchBtn.setOnClickListener(this);
    foundWords = findViewById(R.id.foundWords);
    foundWords.setMovementMethod(new ScrollingMovementMethod());


private class AsyncRequest extends AsyncTask<String, Void, ArrayList<WordCard>> 
    @Override
    protected ArrayList<WordCard> doInBackground(String... args) 
        cardsParser = new CardsParser();
        return cardsParser.parse(editText.getText().toString());
    

    @Override
    protected void onPostExecute(ArrayList<WordCard> cards) 
        for (WordCard card : cards) 
            foundWords.append(card.word);
            foundWords.append("\n");
        
    


@Override
public void onClick(View v) 
    switch (v.getId()) 
        case R.id.srchBtn:
            foundWords.setText("");
            new AsyncRequest().execute();
            break;
    

【问题讨论】:

不确定是否有帮助,但请避免从 doInBackground 中引用 UI 对象。通过 AsyncTask 的执行参数提供 EditText 字符串。 @Lino 我试过了,但没有帮助 【参考方案1】:

我发现了错误。 CardsParser 类每次都生成相同的 URL,这就是它不能正常工作的原因。

【讨论】:

以上是关于AsyncTask 的 onPostExecute 方法获取相同的参数的主要内容,如果未能解决你的问题,请参考以下文章

片段中的 Asynctask 未到达 onPostExecute

无法覆盖 AsyncTask 类中的 onPostExecute() 方法或使其触发

onPostExecute() 无法重新运行从活动调用的 asyncTask

AsyncTask中onPostExecute方法的返回类型可以不为void吗?

Android,AsyncTask 不调用 onProgressUpdate 和 onPostExecute

从Asynctask ONPostExecute调用片段方法