【问题标题】:AsyncTask onPostExecute listener [duplicate]AsyncTask onPostExecute 监听器[重复]
【发布时间】:2015-12-19 13:17:09
【问题描述】:

Activity.java

//Activity stuff
MyClass mc = new MyClass();
mc.getText();

public void dosomething() {
    textview.setText(mc.getText());
}

MyClass.java

class MyClass { 
    String text;
    public void setText() {
        class GetTextFromWEB extends AsyncTask<String, Void, String> {
            @Override
            protected String doInBackground(String... urls) {
                String url = urls[0];
                String output;
                //Getting text from web
                return output;
            }
            @Override
            protected void onPostExecute(String _text) {
                text = _text;
            }
        }
        String url = "google.com";
        //Doing with url something
        new GetText().execute(url);
    }
    public String getText() {return text;}
}

问题是 - 在活动 setText 中做得更快,然后 AsyncTask 完成它的工作。
所以当 setText 运行时,它就像setText(null) 我需要检查活动,异步结束,所以我要设置我的文本。 我希望我解释了它

而且我什至不需要完全 AsyncTask,我需要 jsoup 工作,所以如果有另一个线程类的解决方案,jsoup 可以工作,我可以使用它

编辑

class GetLyrics extends AsyncTask<String, Void, String> { //Class for getting lyrics
    private Context con;

    public GetLyrics(Context con) {
        this.con = con;
    }

    @Override
    protected String doInBackground(String... urls) {
        //do something
    }
    @Override
    protected void onPostExecute(String _lyrics) {
        lyrics = _lyrics;
        con.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                ((TextView) findViewById(R.id.lyricsOutput)).setText(lyrics);
            }
        });
    }
}

【问题讨论】:

  • @NigamPatro 谢谢,我会试试
  • @NigamPatro 不,这对我不起作用,因为我无法在onPostExecutenew Asynctaskclass().execute(url); 中设置Text 我需要在另一个地方听...
  • 您是否创建了监听器类并按照给定的方式调用了onPostExecute() 中的方法?
  • 这就是我在那里给出的答案,你能发布你到目前为止所尝试的内容吗?这样我就可以根据您的代码给出适当的解释。

标签: java android android-asynctask


【解决方案1】:

在 AsyncTask 的 postExecute 中调用设置文本的方法,或直接在 postExecute 方法中设置文本。

并在 runOnUIThread 中用 setText() 换行(否则您将收到一个异常,指出该视图只能由创建它的线程访问,因为您是从异步任务中设置文本)。

设置文本是这样的

    getActivity().runOnUiThread(new Runnable() {
        @Override
        public void run() {
            ((TextView) findViewById(R.id.txtFieldName)).setText("your text");
        }
    });

这样你就不用担心检查异步任务是否完成了。但是要避免像这样复杂的 ui 操作。由于这只是在TextView上设置文本,应该没问题。

【讨论】:

  • 对不起,这听起来像是我需要的,但我必须将它粘贴到哪里?在activity/settext/asynctask中?
  • 您设置文本的行应该被给定的sn-p替换。只需删除运行块内的行并粘贴您设置的代码文本行。
  • 另外,就像我说的,在 postExecute 中像上面一样直接设置文本。
  • 我在活动和 postExecute 中有一个错误Cannot resolve getActivity()
  • 您可以将活动上下文作为参数传递给 AsyncTask 类构造函数,并使用上下文而不是 getActivity()
【解决方案2】:

1:根据我之前的帖子制作我的第一个项目,并在其中添加一些新行以从 http:api 获取数据。

public class Example extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_example);
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("parameter1", "xyz"));
        params.add(new BasicNameValuePair("parameter2", "abc"));
        params.add(new BasicNameValuePair("parameter3", "opqr"));
        ServerConnection task = new ServerConnection(this, new ResultListener() {
            @Override
            public void result(String response) {
                Toast.make(this, response, Toast.LENGTH_LONG).show();
            }

            @Override
            public void loader(boolean visble) {
            }

            @Override
            public void connectionLost(String error) {
                Toast.make(this, error, Toast.LENGTH_LONG).show();
            }
        });
    }


    public class ServerConnection extends AsyncTask<String, String, String> implements Constant {
        ResultListener listener;
        private String Method = "GET";
        private List<NameValuePair> params = new ArrayList<NameValuePair>();

        private Context context;
        private ConnectionDetector cd;

        // public static Drawable drawable;
        public ServerConnection(Context context, ResultListener r) {
            this.context = context;
            this.listener = r;
            cd = new ConnectionDetector(context);
            this.execute();
        }

        public boolean isConnection() {
            return cd.isConnectingToInternet();
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(String... arg0) {
            if (!isConnection()) {
                cancel(true);
                return "Sorry!connection lost,try again or later";
            }
            ApiResponse air = new ApiResponse();
            System.out.println("working hre" + "hi");
            String json;

            try {
                json = air.makeHttpRequest(URL, getMethod(), getParams());
            } catch (Exception e) {
                json = e.getMessage();
                cancel(true);
                return json;
            }

            return json;
        }

        @TargetApi(Build.VERSION_CODES.HONEYCOMB)
        @Override
        protected void onCancelled(String result) {
            listener.connectionLost(result);
            rl.connectionLost("Sorry!connection lost,try again or later");
            super.onCancelled(result);
        }

        @Override
        protected void onPostExecute(String result) {
            System.out.println("onpost" + result);
            listener.result(result);
            listener.loader(true);
            super.onPostExecute(result);
        }

        public String getMethod() {
            return Method;
        }

        public void setMethod(String method) {
            Method = method;
        }

        public List<NameValuePair> getParams() {
            return params;
        }

        public void setParams(List<NameValuePair> params) {
            this.params = params;
        }
    }         

Example

【讨论】:

  • 就像我说的,我有 asynctask,它在函数中执行,没有 textview。所以我需要检查一下,onPostExecute 是否运行过
  • public void result(String response) { textView.setText(response); Toast.make(this,response,Toast.LENGTH_LONG).show(); }
  • 我有它在不同的类。
  • 我可以知道完整的情况,您需要不同的方法。我一定可以帮助你。
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
  • 2017-04-02
相关资源
最近更新 更多