我遇到一个问题,就是我无法从asyncTask访问ListView
实际上,我真的不知道这里的真正问题 让我告诉你发生了什么
我有一个活动正在执行AsyncTask并创建HttpURLConnection
。有时我会收到异常(ProtocolException
,因为流意外结束了。
因此,我为此异常创建了一个处理程序,该处理程序在活动类中调用一个函数或方法向用户显示消息
这是一张图片,您可以了解我的项目。
这里的问题是在抛出异常时,调用了与我用于将文本添加到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
}
}
}
}
我不知道该怎么解释。
答案 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();
}
}
}
}