我正在使用AsyncTask来执行长时间运行的任务,但它似乎仍然在主ui中执行

Kit*_*mos 1 user-interface multithreading android android-asynctask android-anr-dialog

我正在尝试编写一个测试应用程序来压缩和解压缩文件.我找到了一个用于进行文件压缩/解压缩的开源库,但是你可以猜测这确实需要一段时间,因此我无法在主ui中运行它所以我以为我会使用AsyncTask在后台线程上进行繁重的工作,然后只是呕吐开始,一个完成的消息,一切都会没事的.但我在这里遇到两个大问题.当我点击按钮时,它确实会解压缩文件,但它似乎是在主ui而不是在后台线程中执行它,因为应用程序将锁定并且我确实得到了anr屏幕,而且我正在注意任何新的线程确实使用ddms视图出现,我没有看到任何.如果我告诉它我想等待它将解压缩文件.但是我当然不希望程序出现冻结或者对我不利另一个问题是我已将它设置为在点击后立即更新按钮文本,然后在aysc任务完成时再次更新但是我不知道看看是否发生了变化,我确实改变了文本,以便它们在所有不同的地方,所以我可以告诉.它也应该在状态消息中设置一个文本字段.我认为onPostExecute永远不会被调用.谁能告诉我这里发生了什么?

package net.pawworks.sandbox.svc;

import java.io.File;
import net.pawworks.utils.mainlib.filetools;
import net.pawworks.utils.mainlib.zipper;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class TestserviceActivity extends Activity {
    /** Called when the activity is first created. */
    String readpath= filetools.sdcardpath()+"/ziptestin/";
    TextView readstatus;
    Button readbut;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ziptest);
        File setup = new File(filetools.sdcardpath()+"/ziptestout");
        setup.mkdir();
        setup = new File(filetools.sdcardpath()+"/ziptestin/");
        setup.mkdir();
        readstatus = (TextView)findViewById(R.id.readstatus);
        readbut = (Button)findViewById(R.id.readit);
        readbut.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v)
            {
                readbut.setText("Loading.....");
                String status="";
                // TODO Auto-generated method stub
                File setup = new File(readpath+"jpgs.zip");
                if(setup.canRead())
                {
                    status="File Readable\n";
                    new unpackit().doInBackground(new String[]{"jpgs.zip",status} );
                    readbut.setText("Read!");
                }
                else {status = "File not Readable:"+setup.toString();readstatus.setText(status);readbut.setText("Read.");}


            }
        });
       }
    private class unpackit extends AsyncTask<String, Void, String>
    {

        @Override
        protected String doInBackground(String... params) 
        {
            // TODO Auto-generated method stub
            Log.e("asynctask", "1:"+params[0]+"2:"+params[1]);
            zipper d = new zipper(readpath+"jpgs.zip",filetools.sdcardpath()+"/ziptestout/");
            d.unzip();
            return params[1]+"\n"+d.status();
        }

        @Override
        protected void onPostExecute(String result)
        {
            readstatus.setText(result);
            readbut.setText("Read?");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

mfr*_*kli 7

你想要打电话

new unpackit().execute(args);
Run Code Online (Sandbox Code Playgroud)

而不是doInBackground(args).它类似于在线程上调用start()而不是run() - 在这种情况下,你的UI线程只是在doInBackground()中执行代码,但它不会调用任何其他东西.

有关更多信息,请参阅此处的文档和示例代码.