笔录下有关调用RAR解压缩的问题

by admin on 2018年10月20日

亚不行写代码关系及调用RAR实现消除压缩了。还是记录下来一下问题。

 

第一蹩脚是描摹Demo,试验通过RAR解压缩实现网站升级覆盖。

【声明】

首先次等写时遇的题材记录:

迎转载,但要保留文章原来出处→_→

1。在XP下,在Web中解压覆盖着运行的Asp.net程序目录(自身覆盖自身)。出错-》异常是经过内自己无法掩盖好

命壹号:http://www.cnblogs.com/smyhvae/

化解进程是:以为通过创办应用程序域来化解这问题,失败!

文章来源:http://www.cnblogs.com/smyhvae/p/3866570.html

进而将种放到Win 2003
桌面上,调用解压,能解压,但滥的匪了解解压了什么事物出来了。

 

由来是:桌面涉及到几近个用户问题,放到CDEF盘就如常了。

【正文】

接下来拿品种放到Win 2003 其它一个盘中,解压正常。

正文将执教一下Android之多线程的学识,以及怎样通过AsyncTask机制来促成线程之间的通信。

案由应是:XP的IIS和Win 2003底IIS原理的两样。xp是特进程,2003凡基本上进程。

一如既往、Android当中的多线程:

 

在Android当中,当一个应用程序的零件启动之时节,并且没有外的应用程序组件在运行时,Android系统便见面吗该应用程序组件开辟一个初的线程来实行。默认的情下,在一个相同Android应用程序当中,里面的零部件都是运行在和一个线程里之,这个线程称之为Main线程。当我们透过某个组件来启动另一个组件的时节,这个时节默认都是在和一个线程当中就的。当然,我们可自己来管理我们的Android应用之线程,我们得以根据我们协调的需要来叫应用程序创建额外的线程。

仲糟糕就是以做Winform安装包时。

二、Main Thread 和 Worker Thread:

通过调用RAR解压安装项目,出现问题:

以Android当中,通常用线程分为两栽,一栽叫做Main Thread,除了Main
Thread之外的线程都只是称为Worker Thread。

1。解压路径中隐含空格,所以出错,弄了充分遥远才发觉。

当一个应用程序运行的时刻,Android操作系统就是会叫该应用程序启动一个线程,这个线程就是我们的Main
Thread,这个线程非常关键,它要用来加载UI界面,完成系统与用户之间的相,并以互动后的结果以显得给用户,所以Main
Thread又受称UI Thread。

解决就是一旦路径有空格,加双引号包起来。

Android系统默认不见面让应用程序组件创建一个分外的线程,所有的这些零部件默认都是在和一个线程中运作。然而,某些时刻当我们的应用程序需要做到一个耗时操作的时光(如访问网络或者是本着数据库进行查询),此时UI
Thread就会见叫打断。例如,当我们点击一个Button,然后希望其打网中得到有多少,如果是操作以UI
Thread当中就的讲话,UI线程就见面处在阻塞的状态,此时,我们的体系非见面调度外其它的轩然大波,更不好之凡,当我们的凡事现场设打断时越5秒钟(官方描述),这个时刻就会冒出
著名的ANR (Application Not
Responding)的题材,此时,应用程序会弹出一个羁绊,让用户选择是否退出该次。对于Android开发来说,出现ANR的现象是绝免克为允许的。

2。网上的命令行没有后台运行参数

此外,由于Android UI控件不是线程安全之,所以我们无克当UI
Thread之外的线程当中对UI控件进行操作。因此在Android的多线程编程当中,有少漫长老主要之标准化必须遵:

缓解就是单身找,最后找到同样久“-ibck”

  • 莫克当UI
    Thread当中进行耗时操作,以免阻塞UI Thread
  • 不能够在UI
    Thread之外的线程当中操纵UI元素

 

 三、如何处理UI Thread 和 Worker Thread之间的通信:

发一下代码:

咱们既然非克当主线程当中处理耗时的操作,又休可知以干活线程中来访问我们的UI控件,那么我们循从网被如果产充斥同张图片,又怎么能用那创新到UI控件上呢?这即提到及了主线程和办事线程之间的通信问题了。在Android当中,提供了异步消息处理机制的简单栽方式来解决线程之间的通信问题,一种是透过Handler的编制(这种方式以后边的博客中将详细介绍),还有同种不畏是今要详细讲解的
AsyncTask 机制。

 

四、AsyncTask:

图片 1图片 2代码

AsyncTask:异步任务,从字面上吧,就是以UI主线程运行的当儿,异步完成部分操作。AsyncTask允许我们于后台执行一个异步任务。我们得以拿耗时底操作放在异步任务中来执行,并时时将任务执行的结果回到给UI线程来更新UI控件。通过AsyncTask我们可以轻松解决多线程之间的通信问题。

public bool WARToFoler(string rarFromPath, string rarToPath)
        {
            Process rarPro = new Process();
            rarPro.StartInfo.FileName = AppConfig.SoftSetup_WinRARSystemPath;
            rarPro.StartInfo.Arguments = string.Format(” x  \”{0}\” \”{1}\” -o+ -r -ibck”, rarFromPath, rarToPath);
            rarPro.StartInfo.UseShellExecute = false;
            rarPro.StartInfo.RedirectStandardInput = true;
            rarPro.StartInfo.RedirectStandardOutput = true;
            rarPro.StartInfo.RedirectStandardError = true;
            rarPro.StartInfo.CreateNoWindow = true;
            rarPro.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            rarPro.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(p_OutputDataReceived);
            rarPro.ErrorDataReceived += new DataReceivedEventHandler(rarPro_ErrorDataReceived);
            rarPro.Start();//解压开始  
            rarPro.BeginOutputReadLine();
            rarPro.BeginErrorReadLine();
            rarPro.WaitForExit();
            rarPro.Dispose();
            return IsOK;
        }
        void rarPro_ErrorDataReceived(object sender, DataReceivedEventArgs e)
        {
            if (e.Data!=null && e.Data != “”)
            {
                outMsg.Text += “失败:” + e.Data + “\r\n”;
                IsOK = false;
            }
        }
        void p_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
        {
            if (e.Data != null && e.Data != “”)
            {
                outMsg.Text+=”成功:” + e.Data + “\r\n”;
            }
        }

怎么来了解AsyncTask呢?通俗的话,AsyncTask就一定于Android为咱提供了一个大抵线程编程的一个框架,其在Thread和Handler之间,我们而一旦定义一个AsyncTask,就需要定义一个好像来连续AsyncTask这个抽象类,并落实其唯一的一个
doInBackgroud 抽象方法。

 

倘若控AsyncTask,我们就算必须使一个概念,总结起来就是: 3独泛型,4个步骤。

 

俺们来看望AsyncTask这个抽象类的概念,当我们定义一个看似来继续AsyncTask这个看似的时节,需要也其指定3单泛型参数:

RAR参数命令自己哪怕无干上来了,听说RAR安装目录的扶文档下就是出:我假装的破解版打不开。

AsyncTask <Params, Progress, Result>

 

  • Params:
    指定的是咱们传递让异步任务履行时的参数的种
  • Progress:
    指定的凡我们的异步任务在执行的当儿用实施的进度返回给UI线程的参数的档次
  • Result:
    指定的是异步任务执行完后赶回给UI线程的结果的品类

 我们当概念一个接近继承AsyncTask类的时节,必须指定好马上三单泛型的品种,如果都非指定的话,则还拿其状成Void,例如:

AsyncTask <Void, Void, Void>

4单步骤:当我们实践一个异步任务时,需要遵循下面的4独步骤分别实施:

  • onPreExecute(): 这个办法是于实践异步任务之前的时刻实施,并且是当UI
    Thread当中实行之,通常咱们以斯措施里举行有UI控件的初始化的操作,例如弹出ProgressDialog
  • doInBackground(Params…
    params):
     在onPreExecute()方法执行了晚,会立刻行这个点子,这个点子就是来处理异步任务的办法,Android操作系统会在后台的线程池当中开一个worker
    thread来实施之艺术(即当worker
    thread当中实行),执行了晚将实施结果发送给最终一个 onPostExecute
    方法,在此法子里,我们得由网中获取数据等局部耗时的操作
  • onProgressUpdate(Progess…
    values):
     这个措施吧是以UI
    Thread当中实行之,在异步任务尽的当儿,有时用用执之速度返回给UI界面,例如下载一摆设网络图片,我们得天天显示该下载的快慢,就好使用这主意来更新快。这个法在调用之前,我们得以
    doInBackground 方法吃调用一个 publishProgress(Progress)
    的方来以速时时刻刻传递给 onProgressUpdate 方法来更新
  • onPostExecute(Result…
    result):
     当异步任务尽完毕以后,就会以结果回到给这个点子,这个主意为是当UI
    Thread当中调用的,我们可将回到的结果显示在UI控件上

 为什么AsyncTask抽象类才发生一个 doInBackground
的架空方法呢??原因是,我们若要是做一个异步任务,我们亟须要啊夫开拓一个初的Thread,让其成功部分操作,而以做到这异步任务时,我或并不需要弹有ProgressDialog,并不需要随时更新ProgressDialog的快慢漫长,也并不需要将结果更新受UI界面,所以除了 doInBackground
方法之外的老三单道,都不是须有,因此要使贯彻之办法是 doInBackground
方法。

4个步骤简洁版描述如下:

  第一步:表示任务履行前的操作

  第二步:主要得耗时操作

  第三步:主要是更新UI操作

  第四步:产生最终结果

以下实例中象征的意义为:

  第一步:显示速度长条

  第二步:(此任务必不可少)在后台执行任务,将速值传为第三步,将结果传于第四步;

  第三步:进度值更新

  第四步:产生最终结出

 

五、【实例】通过AsyncTask来打网上下载一摆放图:

下面通过简单只代码示例,来看看哪些通过AsyncTask来打网上下载一摆图片,并创新至ImageView控件上。

在马上前面,必须使履行的操作是:添加罗网授权。下面的例证将出详细的操作描述。

【实例一】从网下充斥图片,弹出一个ProgressDialog,但非显示实时进度:

1、添加网络授权:

因为手机默认不能够访问网络,所以率先使以清单文件
AndroidManifest.xml中补充加网络授权。

方式如下:

开拓AndroidManifest.xml文件,点击”Permissions”按钮,然后点击“Add”:

图片 3

弹有对话框后,选择最后一码:Users
Permission:

图片 4

接着选择中的Internet选项:

图片 5

论Ctrl+S保存即可。

继而,我们在清单文件中就能看相应自动生成的代码:

图片 6

 

事实上,直接当AndroidManifest.xml文件被补充加上这一行代码也是可的。

2、完整版本代码如下:

activity_main.xml的代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="136dp"
        android:text="下载网络图片" />
</RelativeLayout>

MainActivity.java的代码:

package com.example.downloadimage01;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity {
    private ImageView imageView ;
    private Button button ;   
    private ProgressDialog dialog ;
    //来自网络的图片
    private String image_path = "http://imgsrc.baidu.com/forum/pic/item/7c1ed21b0ef41bd51a5ac36451da81cb39db3d10.jpg" ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //添加弹出的对话框
        dialog = new ProgressDialog(this) ;
        dialog.setTitle("提示") ;
        dialog.setMessage("正在下载图片,请稍后···") ;

        imageView = (ImageView)findViewById(R.id.imageView1) ;
        button = (Button)findViewById(R.id.button1) ;
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
            //点击按钮时,执行异步任务的操作
                new DownTask().execute(image_path) ;
            }
        }) ;   //注意,这个地方的分号容易遗忘
    }
    /* 
     * 异步任务执行网络下载图片
     * */
    public class DownTask extends AsyncTask<String, Void, Bitmap> {
    //上面的方法中,第一个参数:网络图片的路径,第二个参数的包装类:进度的刻度,第三个参数:任务执行的返回结果
        @Override
        //在界面上显示进度条
        protected void onPreExecute() {
            dialog.show() ;
        };
        protected Bitmap doInBackground(String... params) {  //三个点,代表可变参数
            //使用网络链接类HttpClient类完成对网络数据的提取
            HttpClient httpClient = new DefaultHttpClient() ;
            HttpGet httpget = new HttpGet(params[0]) ;
            Bitmap bitmap = null ;
            try {
                HttpResponse httpResponse = httpClient.execute(httpget) ;
                if(httpResponse.getStatusLine().getStatusCode()==200){
                    HttpEntity httpEntity = httpResponse.getEntity() ;
                    byte[] data = EntityUtils.toByteArray(httpEntity);
                    bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
                }
            }  catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return bitmap;
        }
            //主要是更新UI
            @Override
            protected void onPostExecute(Bitmap result) { 
                super.onPostExecute(result);
                imageView.setImageBitmap(result) ;//更新UI
                dialog.dismiss() ;                
            }        
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

运作后,点击按钮,显示结果如下:

图片 7图片 8

 

 【实例二】从网络下充斥图片,弹出能形速度值的对话框:

流动:既然要显速度值,所以这边的快漫漫风格使安装为水平。

1、添加网络授权(同上)

2、完整版本代码如下:

activity_main.xml的代码和【实例一】中的平;

MainActivity.java的代码:

  1 package com.example.smyh001downloadimage01;
  2 
  3 import java.io.ByteArrayOutputStream;
  4 import java.io.InputStream;
  5 
  6 import org.apache.http.HttpEntity;
  7 import org.apache.http.HttpResponse;
  8 import org.apache.http.client.HttpClient;
  9 import org.apache.http.client.methods.HttpGet;
 10 import org.apache.http.impl.client.DefaultHttpClient;
 11 
 12 import android.app.Activity;
 13 import android.app.ProgressDialog;
 14 import android.graphics.Bitmap;
 15 import android.graphics.BitmapFactory;
 16 import android.os.AsyncTask;
 17 import android.os.Bundle;
 18 import android.view.Menu;
 19 import android.view.View;
 20 import android.view.View.OnClickListener;
 21 import android.widget.Button;
 22 import android.widget.ImageView;
 23 
 24 public class MainActivity extends Activity {
 25 
 26     private ImageView imageView ;
 27     private Button button ;   
 28     private ProgressDialog dialog ;
 29     //来自网络的图片
 30     private String image_path = "http://imgsrc.baidu.com/forum/pic/item/7c1ed21b0ef41bd51a5ac36451da81cb39db3d10.jpg" ;
 31     @Override
 32     protected void onCreate(Bundle savedInstanceState) {
 33         super.onCreate(savedInstanceState);
 34         setContentView(R.layout.activity_main);
 35         
 36         //添加弹出的对话框
 37         dialog = new ProgressDialog(this) ;
 38         dialog.setTitle("提示") ;
 39         dialog.setMessage("正在下载图片,请稍后···") ;
 40         //将进度条设置为水平风格,让其能够显示具体的进度值
 41         dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) ;
 42         dialog.setCancelable(false) ; //用了这个方法之后,直到图片下载完成,进度条才会消失(即使在这之前点击了屏幕)
 43         
 44         imageView = (ImageView)findViewById(R.id.imageView1) ;
 45         button = (Button)findViewById(R.id.button1) ;
 46         button.setOnClickListener(new OnClickListener() {
 47             
 48             @Override
 49             public void onClick(View v) {
 50             //点击按钮时,执行异步任务的操作
 51                 new DownTask().execute(image_path) ;
 52             }
 53         }) ;   //注意,这个地方的分号容易遗忘
 54 
 55     }    
 56 
 57 
 58     /* 
 59      * 异步任务执行网络下载图片
 60      * */
 61     public class DownTask extends AsyncTask<String, Integer, byte[]> {
 62     //上面的方法中,第一个参数:网络图片的路径,第二个参数的包装类:进度的刻度,第三个参数:任务执行的返回结果
 63         @Override
 64         //在界面上显示进度条
 65         protected void onPreExecute() {
 66             dialog.show() ;
 67         };
 68 
 69         protected byte[] doInBackground(String... params) {  //三个点,代表可变参数
 70             //使用网络链接类HttpClient类完成对网络数据的提取,即完成对图片的下载功能
 71             HttpClient httpClient = new DefaultHttpClient() ;
 72             HttpGet httpget = new HttpGet(params[0]) ;
 73             byte[] result = null ;
 74             ByteArrayOutputStream outputStream = new ByteArrayOutputStream() ;
 75             InputStream inputStream = null ;
 76             
 77             try {
 78                 HttpResponse httpResponse = httpClient.execute(httpget) ;
 79                 if(httpResponse.getStatusLine().getStatusCode()==200){
 80                     
 81                     HttpEntity httpEntiry = httpResponse.getEntity();
 82                     inputStream = httpEntiry.getContent();
 83                     //    先要获得文件的总长度
 84                     long file_length = httpResponse.getEntity().getContentLength() ;
 85                     int len = 0 ;
 86                     //    每次读取1024个字节
 87                     byte[] data = new byte[1024] ;  
 88                     //    每次读取后累加的长度
 89                     int total_length = 0 ;          
 90                     while ((len = inputStream.read(data))!=-1) {
 91                         //    每读一次,就将total_length累加起来
 92                         total_length+=len ;
 93                         //    得到当前图片下载的进度
 94                         int progress_value = (int) ((total_length / (float)file_length)*100);
 95                         //    时刻将当前进度更新给onProgressUpdate方法
 96                         publishProgress(progress_value) ;
 97                         outputStream.write(data, 0, len);
 98                     }
 99                     //    边读边写到ByteArrayOutputStream当中
100                     result = outputStream.toByteArray();
101                     //bitmap = BitmapFactory.decodeByteArray(result, 0, result.length) ;
102                 }
103             }  catch (Exception e) {
104                 // TODO Auto-generated catch block
105                 e.printStackTrace();
106             } finally {
107                 httpClient.getConnectionManager().shutdown();
108             }
109             return result;
110         }
111             
112         @Override
113         protected void onProgressUpdate(Integer... values) {
114             // TODO Auto-generated method stub
115             super.onProgressUpdate(values);
116             //    更新ProgressDialog的进度条
117             dialog.setProgress(values[0]);
118         }
119         
120         //主要是更新UI        
121         @Override
122         protected void onPostExecute(byte[] result) { 
123             super.onPostExecute(result);
124             //    将doInBackground方法返回的byte[]解码成要给Bitmap
125             Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0, result.length) ;
126             //    更新我们的ImageView控件
127             imageView.setImageBitmap(bitmap) ;//更新UI
128             //    使ProgressDialog框消失
129             dialog.dismiss() ;    
130         }        
131     }
132 
133     @Override
134     public boolean onCreateOptionsMenu(Menu menu) {
135         // Inflate the menu; this adds items to the action bar if it is present.
136         getMenuInflater().inflate(R.menu.main, menu);
137         return true;
138     }
139     
140 }

 

运作后,显示结果如下:

 图片 9图片 10 

【工程文件】

链接:http://pan.baidu.com/s/1dDvhXkt

密码:47ce

 

六、AsyncTask的严重性知识点:

知晓了AsyncTask的劳作规律后,继续添一下AsyncTask的一些另知识点:

1、Cancelling a Task

俺们好当任何时刻来取消异步任务的实施,通过调用
cancel(boolean)方法,调用了这个点子后系统会就调用 isCancelled()
方法以返回true。如果调用了是法,那么在 doInBackgroud()
方法执行了以后,就不见面调用 onPostExecute() 方法了,取而代之的是调用
onCancelled()
方法。如果生必要的话,为了保Task已经让取消了,我们需要常调用
isCancelled() 方法来判定。

2、在运用AsyncTask做异步任务之上要使论的法:

  • AsyncTask类必须于UI
    Thread当中加载,在Android Jelly_Bean版本后这些还是电动就的
  • AsyncTask的对象要于UI
    Thread当中实例化
  • execute方法要以UI
    Thread当中调用
  • 毫不手动的去调用AsyncTask的季个章程,这些还是出于Android系统自动调用的
  • AsyncTask任务只能吃实施同样不良

 

【总结】

及此,有关AsyncTask的总结就到是结束了,本文主要教授了Android中之多线程知识,并且详细地讲学了
AsyncTask 异步任务的定义与贯彻机制,并经实例来打听 AsyncTask
的尽过程,最后还补充了 AsyncTask
的片最主要知识点,包括怎样取消一个 AsyncTask 以及当采用 AsyncTask
时所不可不比照的规则。建议初家(包括自我)在掌握这上面的题目常常得多参考官方的API文档。

 

本身之民众号

 

想学习代码之外的软技能?不妨关注本身之微信公众号:身团队(id:vitateam)。

 

扫一扫,你以发现其他一个新的社会风气,而立将凡相同集美丽的意外:

 

图片 11

 

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图