从asyncTask中的异常访问视图的问题

时间:2018-10-01 09:44:33

标签: java android android-asynctask

enter image description here

我遇到一个问题,就是我无法从asyncTask访问ListView

实际上,我真的不知道这里的真正问题 让我告诉你发生了什么

我有一个活动正在执行AsyncTask并创建HttpURLConnection。有时我会收到异常(ProtocolException,因为流意外结束了。 因此,我为此异常创建了一个处理程序,该处理程序在活动类中调用一个函数或方法向用户显示消息

这是一张图片,您可以了解我的项目。

image

这里的问题是在抛出异常时,调用了与我用于将文本添加到listView的函数/方法相同的函数/方法,但是在调用listView之后,该函数/方法消失了,但是当我手动最小化软键盘时,一切都变得很好了

我班的结构是

public class MainActivity extends AppCompatActivity
{
    protected void onCreate(Bundle savedInstanceState)
    {
        addMessageToListView()//works fin here
    }
    protected void addMessage(String message, int userMessage, ListView listView) // the function
    {
        try
        {
            messages.add(new Message(message,userMessage));
            MessagesAdapter messagesAdapter = new MessagesAdapter(messages, getBaseContext());
            messagesAdapter.notifyDataSetChanged();
            listView.setAdapter(messagesAdapter);
        }
        catch (Exception exception)
        {

        }
    }
     private class HttpPostAsyncTask extends AsyncTask<String, Void, String>
    {
        ...
        @Override
        protected void onPostExecute(String result)
        {
            try
            {
                addMessageToListView()//works fin here
            }
            catch (Exception exception)
            {

            }
        }
        protected String doInBackground(String... params)
        {
            String result = "";
            for (int i = 0; i <= 0; ++i)
            {
                result = this.invokePost(params[i], this.postData);
            }
            return result;
        }
        private String invokePost(String requestURL, HashMap<String, String> postDataParams)// called from doInBackground
        {
        try
            {
                addMessageToListView()//works fin here
            }
            catch (Exception exception)
            {
                addMessageToListView()//not orking here
            }
        }
    }
}

我不知道该怎么解释。

2 个答案:

答案 0 :(得分:0)

您只能在应用程序的主线程中更改视图。 doInBackground不在应用程序的主线程中运行。

答案 1 :(得分:0)

通过添加以下内容解决:

new Thread() 
                {
                    @Override
                    public void run() 
                    {
                        MainActivity.this.runOnUiThread(new Runnable() 
                        {
                            @Override
                            public void run() 
                            {
                                addMessageToListView()//not orking here
                            }
                        });
                        super.run();
                    }
                }.start();

编辑问题中的先前代码:

public class MainActivity extends AppCompatActivity
{
    protected void onCreate(Bundle savedInstanceState)
    {
        addMessageToListView()//works fin here
    }
    protected void addMessage(String message, int userMessage, ListView listView) // the function
    {
        try
        {
            messages.add(new Message(message,userMessage));
            MessagesAdapter messagesAdapter = new MessagesAdapter(messages, getBaseContext());
            messagesAdapter.notifyDataSetChanged();
            listView.setAdapter(messagesAdapter);
        }
        catch (Exception exception)
        {

        }
    }
     private class HttpPostAsyncTask extends AsyncTask<String, Void, String>
    {
        ...
        @Override
        protected void onPostExecute(String result)
        {
            try
            {
                addMessageToListView()//works fin here
            }
            catch (Exception exception)
            {

            }
        }
        protected String doInBackground(String... params)
        {
            String result = "";
            for (int i = 0; i <= 0; ++i)
            {
                result = this.invokePost(params[i], this.postData);
            }
            return result;
        }
        private String invokePost(String requestURL, HashMap<String, String> postDataParams)// called from doInBackground
        {
        try
            {
                addMessageToListView()//works fin here
            }
            catch (Exception exception)
            {
                new Thread() 
                {
                    @Override
                    public void run() 
                    {
                        MainActivity.this.runOnUiThread(new Runnable() 
                        {
                            @Override
                            public void run() 
                            {
                                addMessageToListView()//not orking here
                            }
                        });
                        super.run();
                    }
                }.start();

            }
        }
    }
}