如何在android应用程序中添加多线程或其他类似功能?

时间:2013-07-19 15:04:57

标签: java android multithreading performance

当我尝试将我的数据库文件发送到我的远程服务器时,我的android应用程序冻结了几秒钟,无论如何我可以使用多线程或其他此类功能将其设置为后台线程吗?

这是对话框的代码,似乎问我是否要发送

    public void showYesNoBox(){
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        switch (which){
        case DialogInterface.BUTTON_POSITIVE:
            //Yes button clicked
            SendData();
            finish();//go back to the previous Activity
        overridePendingTransition(R.anim.fadein, R.anim.fadeout);

            break;

        case DialogInterface.BUTTON_NEGATIVE:
            //No button clicked

            finish();//go back to the previous Activity
        overridePendingTransition(R.anim.fadein, R.anim.fadeout);
            break;
        }
    }
};

AlertDialog.Builder builder = new AlertDialog.Builder(this, AlertDialog.THEME_HOLO_DARK);
builder.setMessage("Do you want to send the data now?");
builder.setPositiveButton("Yes", dialogClickListener);
builder.setNegativeButton("No", dialogClickListener);
builder.show();
}

这是我点击“是”按钮时执行的代码

public void SendData() {

    File path = getDatabasePath(DataBaseHelper.DATABASE_NAME);
    if (path.exists())
        copyDatabase(path);
}


/**
 * Copy the database to the sdcard
 * @param file
 */
private void copyDatabase(File file) {
    SimpleDateFormat dateFormat1 = new SimpleDateFormat("ddMMyy-HHmmss");
    String dateString = dateFormat1.format(new Date());
    String pathdest = getDir().getAbsolutePath() + Configuration.LOST_FOLDER + "/Database/";
    String pathdir = pathdest;
    File dir = new File(pathdir);
    if (!dir.exists())
        dir.mkdirs();

    String namefile = file.getName();
    int pos = namefile.lastIndexOf('.');
    if (pos != -1) {
        String ext = namefile.substring(pos + 1);
        String name = namefile.substring(0, pos - 1);
        pathdest += name;
        pathdest += "_" + dateString;
        pathdest += ext;
    } else {
        pathdest += namefile;
        pathdest += "_" + dateString;
    }

    File filedest = new File(pathdest);
    try {
        if (filedest.createNewFile())
            copyFile(file.getAbsolutePath(), pathdest);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

任何有关此问题的帮助都将非常受欢迎,因为虽然问题不会阻止用户发送数据,但是当它尝试执行操作时,在一个屏幕上卡住几秒钟是很烦人的。

3 个答案:

答案 0 :(得分:2)

while the problem doesn't prevent the user from being able to send the data it is anoying to be stuck on one screen for a few seconds while it attempts to execute the action.

您可以看到AsyncTask。它出于同样的目的。当您想要执行长时间运行的过程(包括转到服务器,执行数据库等等)时,用户不需要停留在UI上。这可以在后台使用AsyncTask完成。那里有很多很好的教程。只是Google吧。结帐Android Background Processing with Threads, Handlers and AsyncTask - TutorialWhat arguments are passed into AsyncTask<arg1, arg2, arg3>?。希望这可以帮助。

答案 1 :(得分:0)

我一直在使用asynctask来处理我想在后台执行的所有进程。

AsyncTask

答案 2 :(得分:0)

使用AsyncTask

中的所有网络操作

如下例

 private class UploadTask extends AsyncTask<URL, Integer, Long> {
 protected Long doInBackground(URL... urls) {
     int count = urls.length;
     long totalSize = 0;
     // upload task 
     return totalSize;
 }

 protected void onProgressUpdate(Integer... progress) {
     setProgressPercent(progress[0]);
 }

 protected void onPostExecute(Long result) {
     showDialog("Downloaded " + result + " bytes");
 }
 }

创建后,任务执行非常简单:

 new UploadTask().execute(url1, url2, url3);