正如您在标题中看到的那样,我每次需要时都尝试不使用 runOnUiThread。我稍后会解释我的意思,但首先,这是我当前的代码(部分):
private void filePaste()
{
final File src = new File(FileClip); //Source file (as a string)
final File dest = new File(myPath.getText()+"/"+src.getName()); //Destination file
final ProgressDialog dlg = new ProgressDialog(AppContext);
final Thread copythread = new Thread(new Runnable() {
public void run() {
if(FileClip==null)
Main.this.runOnUiThread(new Runnable() {
public void run(){
toast(getString(R.string.msg_EmptyClip));
}
});
else
{
if(src.canRead()){
if(!src.isDirectory())
{
try{
BufferedInputStream in = new BufferedInputStream(new FileInputStream(src), 8192);
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(dest));
long pos = 0;
long read = 8192;
byte[] data = new byte[(int)read];
while(pos<src.length()){
int bytes = in.read(data, 0, (int)read);
if(bytes>-1) {
out.write(data,0,bytes);
in.skip(read);
in.mark((int)pos+bytes);
in.reset();
dlg.incrementProgressBy(bytes);
pos+=bytes;
}
}
Main.this.runOnUiThread(new Runnable() {
public void run(){
dlg.dismiss();
}
});
in.close();
out.close();
}catch(final Exception e)
{
Main.this.runOnUiThread(new Runnable() {
public void run(){
alert("filePaste():\n"+e);
}
});
}
if(Moving==true) {
boolean q = src.delete();
if(q==true)
Main.this.runOnUiThread(new Runnable() {
public void run(){
toast(getString(R.string.msg_MoveOK,src.getName()));
}
});
else
Main.this.runOnUiThread(new Runnable() {
public void run(){
toast(getString(R.string.msg_MoveNO,src.getName()),1);
}
});
Moving = false;
}
else {
Main.this.runOnUiThread(new Runnable() {
public void run(){
toast(getString(R.string.msg_CopyOK,src.getName()));
}
});
}
}
}
else
Main.this.runOnUiThread(new Runnable() {
public void run(){
toast(getString(R.string.msg_CopyNO,src.getName()));
}
});
FileClip = null;
Main.this.runOnUiThread(new Runnable() {
public void run(){
getDir(myPath.getText().toString());
}
});
}
}
});
dlg.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dlg.setTitle(Moving?getString(R.string.moving):getString(R.string.copying));
dlg.setMessage(src.getName());
dlg.setCancelable(true);
dlg.setButton(DialogInterface.BUTTON_NEGATIVE, getString(android.R.string.cancel), new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which) {
dlg.cancel();
}
});
dlg.setOnCancelListener(new DialogInterface.OnCancelListener()
{
@Override
public void onCancel(DialogInterface dialog) {
copythread.interrupt();
if(dest.exists())
dest.delete();
}
});
dlg.setMax((int)src.length());
dlg.show();
copythread.start();
}
此代码所做的是尝试复制给定文件(在 FileClip 中存储为字符串)。
如您所见,代码相当长,因为过度使用了runOnUiThread。我想知道如何移动所有的
Main.this.runOnUiThread(new Thread(new Runnable()
public void run()
{
//Simple stuff for 6 lines
}
));
上课什么的。我在想
public class runAtUI implements Runnable
但是我停在那一点上,我不知道如何制作构造函数。我希望你知道我的意思;就像是:
new runAtUI()
{
//This makes less lines IMO, and could be executed
}
*注意:我寻找有关此的主题,但都说相同,使用 runOnUiThread。我知道这没关系,但对于一些简短的事情(比如显示吐司 - 使用 toast() 具有相同目的 - 或再次提醒,但使用 alert()- )这是没有意义的。
PS:这是我正在做的一个简单的文件管理器,由于缺钱,不会在Google Play上发布,我也不想使用广告(破坏名称中的“简单性”)。是的,我知道有免费和无广告(这个词存在吗?)和更好的应用程序,但我想学习如何制作一个 n_n;
任何信息、想法或指南将不胜感激。
编辑#2:感谢所有快速回答的人!您提供的示例现在可以使用,但我希望它更灵活。就像eval("code as string")
在 javascript 中一样(代码不是字符串)。我会考虑回答这个问题,但请保持开放,让人们提供更多想法;D
编辑#3:好的,首先,很抱歉很长时间没有回复。其次,我正在添加指向当前代码的链接,从 123 行(这一行)到pastebin的 77 行代码。我还添加了uithread的代码。关于该应用程序:如果您想对其进行测试,请查看它现在的情况或其他任何情况,给我发邮件,我会发送给您;)