- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了这个问题,我苦苦挣扎了几个小时,我原以为只需要几分钟。
我尝试了很多方法,比如使用线程等,但我认为这可以更容易地完成。
这是我的解压类(Unzipper):
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Observable;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import org.apache.commons.io.IOUtils;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;
public class Decompress extends Observable {
static final String TAG = "UnZip";
int counter;
private String mFileName, mFilePath, mDestinationPath;
public Decompress (String fileName, String filePath, String destinationPath) {
mFileName = "bigflow";
mFilePath = Environment.getExternalStorageDirectory().toString();
mDestinationPath = Environment.getExternalStorageDirectory() + "/bigflow/";
}
public String getFileName () {
return mFileName;
}
public String getFilePath() {
return mFilePath;
}
public String getDestinationPath () {
return mDestinationPath;
}
public void unzip () {
System.out.println("unzipping...");
String fullPath = mFilePath + "/" + mFileName + ".zip";
Log.d(TAG, "unzipping " + mFileName + " to " + mDestinationPath);
new UnZipTask().execute(fullPath, mDestinationPath);
}
private class UnZipTask extends AsyncTask<String, Void, Boolean> {
@SuppressWarnings("rawtypes")
@Override
protected Boolean doInBackground(String... params) {
String filePath = params[0];
String destinationPath = params[1];
File archive = new File(filePath);
try {
ZipFile zipfile = new ZipFile(archive);
for (Enumeration e = zipfile.entries(); e.hasMoreElements();) {
ZipEntry entry = (ZipEntry) e.nextElement();
unzipEntry(zipfile, entry, destinationPath);
}
} catch (Exception e) {
Log.e(TAG, "Error while extracting file " + archive, e);
return false;
}
return true;
}
@Override
protected void onPostExecute(Boolean result) {
setChanged();
notifyObservers();
}
private void unzipEntry(ZipFile zipfile, ZipEntry entry,
String outputDir) throws IOException {
if (entry.isDirectory()) {
createDir(new File(outputDir, entry.getName()));
return;
}
File outputFile = new File(outputDir, entry.getName());
if (!outputFile.getParentFile().exists()) {
createDir(outputFile.getParentFile());
}
Log.v(TAG, "Extracting: " + entry);
BufferedInputStream inputStream = new BufferedInputStream(zipfile.getInputStream(entry));
BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outputFile));
try {
IOUtils.copy(inputStream, outputStream);
} finally {
outputStream.close();
inputStream.close();
-------------------> counter++; <--------------------------------
}
}
private void createDir(File dir) {
if (dir.exists()) {
return;
}
Log.v(TAG, "Creating dir " + dir.getName());
if (!dir.mkdirs()) {
throw new RuntimeException("Can not create dir " + dir);
}
}
}
}
在 counter++;
之后,我想检查它是否在 387(或其他)上,然后我想显示一条消息。但是我不能在这个类中这样做,它需要在主类中完成。
但不知何故我无法让它发生。
如果 counter
== 387 我的程序是否有可能返回到 MainActivity()
并调用一个函数?
public class MainActivity extends Activity {
}
我知道如何做 toast 之类的东西,但它在解压缩类中不起作用。
当计数器达到一定数量时,欢迎任何解决方案显示消息。
我希望你们知道我的意思,否则说出来,总是可以提供更多信息。
试过这个:Toast.makeText(getBaseContext(),"test", Toast.LENGTH_SHORT).show();
getBaseContext 未定义,因为解压缩类不是 Activity。
日志:
11-15 09:20:50.315: E/UnZip(6495): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
11-15 09:20:50.315: E/UnZip(6495): at android.os.Handler.<init>(Handler.java:121)
11-15 09:20:50.315: E/UnZip(6495): at android.widget.Toast$TN.<init>(Toast.java:317)
11-15 09:20:50.315: E/UnZip(6495): at android.widget.Toast.<init>(Toast.java:91)
11-15 09:20:50.315: E/UnZip(6495): at android.widget.Toast.makeText(Toast.java:233)
11-15 09:20:50.315: E/UnZip(6495): at com.bigflow.dark_legacy.MainActivity$1.message(MainActivity.java:45)
11-15 09:20:50.315: E/UnZip(6495): at com.bigflow.dark_legacy.Decompress$UnZipTask.unzipEntry(Decompress.java:109)
11-15 09:20:50.315: E/UnZip(6495): at com.bigflow.dark_legacy.Decompress$UnZipTask.doInBackground(Decompress.java:70)
11-15 09:20:50.315: E/UnZip(6495): at com.bigflow.dark_legacy.Decompress$UnZipTask.doInBackground(Decompress.java:1)
11-15 09:20:50.315: E/UnZip(6495): at android.os.AsyncTask$2.call(AsyncTask.java:264)
11-15 09:20:50.315: E/UnZip(6495): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
11-15 09:20:50.315: E/UnZip(6495): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
11-15 09:20:50.315: E/UnZip(6495): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
11-15 09:20:50.315: E/UnZip(6495): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
11-15 09:20:50.315: E/UnZip(6495): at java.lang.Thread.run(Thread.java:856)
最佳答案
更新:我的意思是,当你说你不能从 Decompress 发出 Toast 消息时(有点懒惰阅读所有内容),我相信你的话,而是尝试将你的 Activities 上下文作为参数发送,然后在 onPostUpdate
.
在这种情况下,您最好的选择是在您的构造函数中也发送一个监听器作为参数。因此,无论在您调用 Decompress
的 Activity 中的什么地方:
主 Activity
public class MainActivity extends Activity {
/*Stuff and more stuff*/
new Decompress (String fileName, String filePath, String destinationPath,
new MyListener(){
public void message() {
Toast.makeText(MainActivity.this, "Your message", Toast.LENGTH_SHORT).show()
}
});
}
解压类:
public class Decompress extends Observable {
static final String TAG = "UnZip";
int counter;
private String mFileName, mFilePath, mDestinationPath;
MyListener listen;
public Decompress (String fileName, String filePath, String destinationPath, MyListener listener) {
mFileName = "bigflow";
mFilePath = Environment.getExternalStorageDirectory().toString();
mDestinationPath = Environment.getExternalStorageDirectory() + "/bigflow/";
listen = listener;
}
//......
当然还有在某处定义的实际接口(interface)
public interface MyListener{
void message();
}
差点忘了
finally {
outputStream.close();
inputStream.close();
counter++;
if(counter == 387) listen.message();
}
不太确定这是否是您想要的,或者在那个部分,但您明白了。
干杯!
关于android - 从其他类调用主函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13393135/
我听说过两种数据库架构。 大师级 主从 master-master不是更适合现在的web吗,因为它就像Git一样,每个单元都有整套数据,如果一个宕机也无所谓。 主从让我想起了 SVN(我不喜欢它),你
我们当前将 MySQL 配置为支持故障转移:Site1 Site2。当它们被设置为主/主时。在给定时间点,应用程序服务器仅主动写入一个站点。我们想要设置一个新的故障转移站点。然后我们将拥有 Site
我听说过两种数据库架构。 大师-大师 主从 master-master 不是更适合当今的网络吗,因为它就像 Git,每个单元都有整套数据,如果其中一个发生故障,也没关系。 主从让我想起 SVN(我不喜
我正在创建一个标记为类别的表,其中主类别(父列)包含 0,子类别包含父类别的 ID。我听说这叫引用。我的问题:这张表的结构正确吗?或者是否有更好的方法,例如实现遍历树或类似方法? CREATE TAB
我正在阅读一份关于 C++ 与 C 的文档。该文档说与 C 相比,C++ 编写得非常紧凑。一个例子是,C 允许 main() 函数类型为 void。另一方面,C++ 不允许这样做,他给出了标准中的以下
C main函数和Java main函数有什么区别? int main( int argc, const char* argv[] ) 对比 public static void main(Strin
我一直摸不着头脑,但运气不好。设计器有一个包含 3 栏的站点、两个侧边栏和一个主要内容区域。 专为桌面设计,左栏、主要内容、右栏。但是,在较小的设备上,我们希望首先堆叠主要内容。 所以通常情况下,你可
我一直在阅读有关 Jenkins 主/从配置的信息,但我仍然有一些问题: 是不是真的没有像 Jenkins 主站那样安装和启动从站 Jenkins?我假设我会以相同的方式安装一个主 Jenkins 和
据我了解,Viemodel中MVVM背后的概念包括业务逻辑和/或诸如暴露于 View 的数据的主/明细关系之类的事物 因此,正如我发现的那样,有很多ORM生成器,例如模型的telerik a.o以及另
我们有一个群集,其中包含3个主分区,每个主分区有2个副本。主/副本分片的总文档数相同;但是,对于同一查询/文档,我们得到3个不同的分数。当我们将preference = primary添加为查询参数时
我有一个非常大/旧/长时间运行的项目,它使用相对于启动目录的路径访问文件资源(即应用程序仅在从特定目录启动时才工作)。当我需要调试程序时,我可以从 eclipse 启动它并使用“运行配置”->->“工
谁能向我解释一下为什么我在这段代码上遇到段错误?我一直试图弄清楚这一点,但在各种搜索中却一无所获。当我运行代码而不调用 main(argc, argv) 时,它会运行。 Slave 仅将 argv 中
使用 xcode 中的默认项目作为主从应用程序,如果我在折叠委托(delegate)中放置 print 调试语句,当我旋转设备时它似乎永远不会被触发(事实上我永远无法触发它)。 我编辑的代码位于 Ap
是否有任何产品可以使 mysql 主/从故障转移过程更容易?一些可以自动发生的事情,而不是手动修复它。 最佳答案 [...稍后...;) 你所说的“更容易”是什么?MySQL 有很多解决方案: MyS
我有两个 mysql 数据库。我想做主/主复制。 复制以一种方式进行。然而,反过来说却不然。该错误表明它无法与用户“test@IPADDRESS”连接。 如何将用户名更改为 repl?从未进行过测试,
我正在尝试在 MySQL 中运行以下查询: GRANT REPLICATION SLAVE ON *.* TO 'replication'@’10.141.2.%’ IDENTIFIED BY ‘sl
我正在尝试使用 Android 提供的主/详细流程模板创建一个应用程序,并且我正在尝试将多个操作栏菜单项添加到操作栏的主要部分和详细信息部分。这就是我要实现的目标: (来源:softwarecrew.
我正在寻找一个跨平台的 C++ master/worker 库或工作队列库。一般的想法是我的应用程序将创建某种任务或工作对象,将它们传递给工作主机或工作队列,这将依次在单独的线程或进程中执行工作。为了
我似乎看到很多人在他们的 MySQL 模式中任意分配大尺寸的主/外键字段,例如 INT(11) 甚至 WordPress 使用的 BIGINT(20)。 如果我错了,请纠正我,但即使是 INT(4)
如果我有一个可以与多个键相关联的用户,正确的表设置应该是: 一个表有两列,例如: UserName | Key 没有主键且用户可以有多行,或者: 具有匹配标识符的两个表 Table 1 Us
我是一名优秀的程序员,十分优秀!