0

正如您在标题中看到的那样,我每次需要时都尝试不使用 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的代码。关于该应用程序:如果您想对其进行测试,请查看它现在的情况或其他任何情况,给我发邮件,我会发送给您;)

4

3 回答 3

1

您可以创建一个实用程序类来封装创建由 UI 线程运行的可运行对象并调用 Toast 的步骤。这是一个简单的实现:

public abstract class ToastUtils {
      /**
       * Displays a toast message, making sure that the toast is always invoked from the main (ui) thread.
       * @param act Calling Activity
       * @param text Toast text
       * @param duration Toast duration
       */
      public static void showToast(final Activity act, final String text, final int duration) {
         act.runOnUiThread(new Runnable() {
            public void run() {
               Toast.makeText(act, text, duration).show();
            }
         });
      }
   }

使用此类,您可以在必要时这样做:

ToastUtils.showToast(this, "一些文本", Toast.LENGTH_SHORT);

于 2012-08-11T05:36:33.987 回答
0

您可以创建一个Handler活动:

Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        switch (msg.what) {
        case R.string.cancel:
            //show toast
            break;
        default:
            break;
        }
    }
};

并从您的线程中使用它,例如:

handler.sendEmptyMessage(R.string.cancel);
于 2012-08-11T05:38:24.750 回答
0

http://developer.android.com/guide/components/processes-and-threads.html

但是,随着操作复杂性的增加,这种代码会变得复杂且难以维护。要处理与工作线程更复杂的交互,您可能会考虑在工作线程中使用 Handler 来处理从 UI 线程传递的消息。不过,也许最好的解决方案是扩展 AsyncTask 类,它可以简化需要与 UI 交互的工作线程任务的执行。

...跳过...

您可以随时在 doInBackground() 中调用 publishProgress() 以在 UI 线程上执行 onProgressUpdate()

在我看来,这就是你想要做的。

关于您的另一个问题(您应该尝试每个主题只问一个问题),用 Java 复制文件是一种已解决的问题。在 SO 上的线程中,我认为这个有一些很好的答案:Standard concise way to copy a file in Java?

于 2012-08-11T06:42:46.843 回答