【发布时间】:2014-05-18 22:14:22
【问题描述】:
Helly 社区。我对 Android 还很陌生,在网络和后端方面可能是最大的菜鸟。 现在我有以下问题。
我正在构建一个简单的聊天应用程序,并希望我的应用程序检查 Parse 服务器以获取特定的消息解析对象。
获取对象,使用它们并删除它们工作正常。 如果我只做一次。
这就是我从云端获取消息并将它们添加到我的应用布局的方式。
ParseQuery<ParseObject> query = ParseQuery.getQuery("message");
query.whereEqualTo("recipient", getRemote_id());
query.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> messages, ParseException e) {
if(messages != null){
Iterator itr = messages.iterator();
while(itr.hasNext()){
ParseObject message = (ParseObject)itr.next();
addMessageToLayout(message.getString("text"), "in", "new", "");
try {
message.delete();
} catch (ParseException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
});
我希望我的应用始终检查新消息。 我试过 AsyncTask 和 while(true) 循环。循环不断创建新的 asynctask 对象。 结果应用程序不再反应并崩溃。
当我使用可运行类的实例时,我收到以下错误:NetworkOnMainThreadException,并且应用程序崩溃。
由于这个错误,我首先尝试使用 asynctask。一个可运行的对象不是在与主线程不同的线程上运行吗?
我尝试让线程休眠几秒钟,但在异步任务的情况下应用程序仍然崩溃。
问题可能如下:我正在使用另一个可运行对象来更新我的应用程序中的一些动画。
我还尝试不使用任何类型的线程,因为解析方法已经在后台运行,所以他们可能甚至不需要一个。由于 NetworkOnMainThreadException,应用程序再次崩溃。
///_////
现在最奇怪的事情来了。如果我没有使用循环,只是在我进入活动时检查消息,我得到一个 NetworkOnMainThreadException,但随后应用程序以某种方式恢复到新打开的活动并从服务器加载我的消息。
当然,在此期间,UI 会被阻止。不过,那是我现在可以让它工作的唯一方法。
使用 Handler 并且 TimerTask 可以工作,但是当我退出 Activity 时,我似乎无法关闭线程。
这是我的代码:
public void startLookingForMessages(){
final Handler handler = new Handler();
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
new GetMessagesTask().execute();
}
});
}
};
timer.schedule(task, 0, 1000);
}
我发现只有当我在调用 onStop() 时尝试关闭线程或关闭 while 循环时才会收到 NetworkOnMainThreadException。如果我让线程做它自己的事情,这意味着任何时候都不要输入任何代码来停止它,我的应用程序可以正常工作。 我该如何克服这个问题?
我知道这有点长。但也许有人有同样的问题,可以在这里获取一些信息。
已经感谢您的帮助 =)
【问题讨论】:
-
解决了我看这个问题stackoverflow.com/questions/17032024/…的问题
-
如果您不再需要帮助,请删除此问题。
-
编辑:它仍然不能像我预期的那样工作。我发现只有当活动中的任何东西试图关闭检查消息的线程时,我才会得到 NetworkOnMainThreadException。例如我的 while(running) 循环。我通过在 onStop() 中将 running 设置为 false 来关闭它。
标签: java android multithreading android-asynctask