我在为RssReader运行我的Android项目时遇到错误.
码:
URL url = new URL(urlToRssFeed);
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader xmlreader = parser.getXMLReader();
RssHandler theRSSHandler = new RssHandler();
xmlreader.setContentHandler(theRSSHandler);
InputSource is = new InputSource(url.openStream());
xmlreader.parse(is);
return theRSSHandler.getFeed();
Run Code Online (Sandbox Code Playgroud)
它显示以下错误:
android.os.NetworkOnMainThreadException
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
我正在尝试编写一个更新的简单应用程序.为此,我需要一个简单的功能,可以下载一个文件,并显示当前进度的ProgressDialog.我知道怎么做ProgressDialog,但我不知道如何显示当前进度以及如何首先下载文件.
有没有办法Context在静态方法中获取当前实例?
我正在寻找那种方式,因为我讨厌每次更改时保存"Context"实例.
我正在尝试同时运行两个AsyncTasks.(平台是Android 1.5,HTC Hero.)但是,只有第一个被执行.这是一个描述我的问题的简单片段:
public class AndroidJunk extends Activity {
class PrinterTask extends AsyncTask<String, Void, Void> {
protected Void doInBackground(String ... x) {
while (true) {
System.out.println(x[0]);
try {
Thread.sleep(1000);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new PrinterTask().execute("bar bar bar");
new PrinterTask().execute("foo foo foo");
System.out.println("onCreate() is done.");
}
}
Run Code Online (Sandbox Code Playgroud)
我期望的输出是:
onCreate() is done.
bar bar bar
foo foo foo
bar bar bar
foo foo foo
Run Code Online (Sandbox Code Playgroud)
等等.但是,我得到的是:
onCreate() is done. …Run Code Online (Sandbox Code Playgroud) 我试图从在线文本文件中读取一些单词.
我尝试过做这样的事情
File file = new File("http://www.puzzlers.org/pub/wordlists/pocket.txt");
Scanner scan = new Scanner(file);
Run Code Online (Sandbox Code Playgroud)
但它没有用,我得到了
http://www.puzzlers.org/pub/wordlists/pocket.txt
Run Code Online (Sandbox Code Playgroud)
作为输出,我只想得到所有的话.
我知道他们在当天教我这个,但我现在不记得到底是怎么做的,非常感谢任何帮助.
AsyncTask 的典型用途:我想在另一个线程中运行一个任务,在该任务完成后,我想在我的 UI 线程中执行一些操作,即隐藏进度条。
任务将开始,TextureView.SurfaceTextureListener.onSurfaceTextureAvailable完成后我想隐藏进度条。同步执行此操作不起作用,因为它会阻止构建 UI 的线程,使屏幕变黑,甚至不显示我之后想隐藏的进度条。
到目前为止,我使用这个:
inner class MyTask : AsyncTask<ProgressBar, Void, ProgressBar>() {
override fun doInBackground(vararg params: ProgressBar?) : ProgressBar {
// do async
return params[0]!!
}
override fun onPostExecute(result: ProgressBar?) {
super.onPostExecute(result)
result?.visibility = View.GONE
}
}
Run Code Online (Sandbox Code Playgroud)
但是这些课程非常丑陋,所以我想摆脱它们。我想用 kotlin 协程来做到这一点。我尝试了一些变体,但它们似乎都不起作用。我最有可能怀疑的工作是这样的:
runBlocking {
// do async
}
progressBar.visibility = View.GONE
Run Code Online (Sandbox Code Playgroud)
但这不能正常工作。据我了解,它runBlocking不会像那样启动一个新线程AsyncTask,这正是我需要它做的。但是使用thread协程,我没有看到在完成时得到通知的合理方法。另外,我也不能放入progressBar.visibility = View.GONE新线程,因为只有UI线程才允许进行此类操作。
我是协程的新手,所以我不太明白我在这里缺少什么。
multithreading android android-asynctask kotlin kotlin-coroutines
如果它有帮助,我想要的东西与谷歌教程中的内容类似
但是在转换之前会创建一个片段.如果我这样做,过渡工作正常; 但我不能用这种方法
=====
针对API 7+,我只想在整个屏幕中看到一个片段,并使用一个按钮(一个带有onTouch事件的绘制按钮),然后交替使用第二个片段,反之亦然.
但是当我用第二个片段替换第一个片段时,或者如果我使用fragmentTransaction.show和fragmentTransaction.hide,我得到一个空白屏幕; 在我得到空白屏幕之前,我可以切换两次.我不想在后台上.
我在MainActivity的onCreate中创建片段:
DiceTable diceTable = new DiceTable();
Logger logger = new Logger();
fragmentTransaction.add(diceTable, DICETABLE_TAG);
fragmentTransaction.add(logger, LOGGER_TAG);
fragmentTransaction.add(R.id.fragment_container, logger);
fragmentTransaction.add(R.id.fragment_container, diceTable);
Run Code Online (Sandbox Code Playgroud)
然后在一个方法(从片段调用)我做切换:
Logger logger = (Logger)fragmentManager.findFragmentByTag(LOGGER_TAG);
DiceTable diceTable = (DiceTable)fragmentManager.findFragmentByTag(DICETABLE_TAG);
if (diceTable.isVisible()) {
fragmentTransaction.replace(R.id.fragment_container, logger);
fragmentTransaction.commit();
fragmentTransaction.hide(diceTable);
fragmentTransaction.show(logger);
}
else if (logger.isVisible()) {
fragmentTransaction.replace(R.id.fragment_container, diceTable);
fragmentTransaction.commit();
fragmentTransaction.hide(logger);
fragmentTransaction.show(diceTable);
}
Run Code Online (Sandbox Code Playgroud)
这不是我应该怎么做的?
更换碎片时出现空白屏幕
我是 Android Java 的新手,我真的很感激我可以得到一些参考和/或示例,以便在不使用 AsyncTask 的情况下进行一些简单的网络调用。
我正在制作一个程序来从 URL 解析一个简单的 JSON 对象。
在 Android 11 (API 30) 中,所有 AsyncTask 都将被弃用,如下所示:
https://developer.android.com/reference/android/os/AsyncTask
因为AsyncTaskLoader一切都AsyncTask可以做到,并且还具有内置的最佳实践功能,例如线程复制和预先成熟的死亡预防.
有没有理由再使用AsyncTask了?或者我应该盲目地AsyncTaskLoader随处使用
还AsyncTask需要吗?
在使用 Java 的 Android 中,我们曾经实现了 and AsyncTask,AsyncTaskLoader但最近我开始学习 Kotlin,我注意到类似的事情是由 Kotlin 协程完成的。