Android 如何将数组列表从AsyncTask返回到主活动中?

Android 如何将数组列表从AsyncTask返回到主活动中?,android,android-asynctask,dropbox,Android,Android Asynctask,Dropbox,我正在尝试在我的应用程序中显示dropbox帐户中的文件列表。我的问题是,如何将列表(fnames)返回到MainActivity中,以便在listview中显示它。 我在主要活动中如何称呼它? android开发新手,欢迎提供任何其他提示 谢谢 public class DbFileExplorer extends AsyncTask<Void, Long, Boolean> { private Context mContext; private final Pr

我正在尝试在我的应用程序中显示dropbox帐户中的文件列表。我的问题是,如何将列表(fnames)返回到MainActivity中,以便在listview中显示它。 我在主要活动中如何称呼它? android开发新手,欢迎提供任何其他提示

谢谢

public class DbFileExplorer extends AsyncTask<Void, Long, Boolean> {

    private Context mContext;
    private final ProgressDialog mDialog;
    private DropboxAPI<?> mApi;
    private String mPath;

    private FileOutputStream mFos;

    private boolean mCanceled;
    private Long mFileLen;
    private String mErrorMsg;
    protected String[] fnames;

    public DbFileExplorer(Context context, DropboxAPI<?> api,
            String dropboxPath, String[] efnames){
        // We set the context this way so we don't accidentally leak activities
        mContext = context.getApplicationContext();
        fnames = efnames;
        mApi = api;
        mPath = dropboxPath;

        mDialog = new ProgressDialog(context);
        mDialog.setMessage("Opening Directory");
        mDialog.show();
    }

    @Override
    protected Boolean doInBackground(Void... params){
        // Get the metadata for a directory
        int i = 0;
        try{
            fnames = null;
            Entry dirent = mApi.metadata(mPath, 1000, null, true, null);
            ArrayList<Entry> files = new ArrayList<Entry>();
            ArrayList<String> dir = new ArrayList<String>();

            for (Entry ent: dirent.contents){
                //Add it to the list of thumbs we can choose from
                files.add(ent);
                dir.add(new String(files.get(i++).path));
            }
            i=0;
            fnames = dir.toArray(new String[dir.size()]);


            return true;
        } catch (DropboxUnlinkedException e) {
            // The AuthSession wasn't properly authenticated or user unlinked.
        } catch (DropboxPartialFileException e) {
            // We canceled the operation
            mErrorMsg = "Download canceled";
        } catch (DropboxServerException e) {
            // Server-side exception.  These are examples of what could happen,
            // but we don't do anything special with them here.
            if (e.error == DropboxServerException._304_NOT_MODIFIED) {
                // won't happen since we don't pass in revision with metadata
            } else if (e.error == DropboxServerException._401_UNAUTHORIZED) {
                // Unauthorized, so we should unlink them.  You may want to
                // automatically log the user out in this case.
            } else if (e.error == DropboxServerException._403_FORBIDDEN) {
                // Not allowed to access this
            } else if (e.error == DropboxServerException._404_NOT_FOUND) {
                // path not found (or if it was the thumbnail, can't be
                // thumbnailed)
            } else if (e.error == DropboxServerException._406_NOT_ACCEPTABLE) {
                // too many entries to return
            } else if (e.error == DropboxServerException._415_UNSUPPORTED_MEDIA) {
                // can't be thumbnailed
            } else if (e.error == DropboxServerException._507_INSUFFICIENT_STORAGE) {
                // user is over quota
            } else {
                // Something else
            }
            // This gets the Dropbox error, translated into the user's language
            mErrorMsg = e.body.userError;
            if (mErrorMsg == null) {
                mErrorMsg = e.body.error;
            }
        } catch (DropboxIOException e) {
            // Happens all the time, probably want to retry automatically.
            mErrorMsg = "Network error.  Try again.";
        } catch (DropboxParseException e) {
            // Probably due to Dropbox server restarting, should retry
            mErrorMsg = "Dropbox error.  Try again.";
        } catch (DropboxException e) {
            // Unknown error
            mErrorMsg = "Unknown error.  Try again.";
        }
        return false;   
    }

    @Override
    protected void onProgressUpdate(Long... progress){
        int percent = (int)(100.0*(double)progress[0]/mFileLen + 0.5);
        mDialog.setProgress(percent);
        }

    @Override
    protected void onPostExecute(Boolean result){
        mDialog.dismiss();
    }


    private void showToast(String msg){
        Toast error = Toast.makeText(mContext, msg, Toast.LENGTH_LONG);
        error.show();
    }
}
公共类DbFileExplorer扩展异步任务{
私有上下文;
私人最终进度对话框;
私有DropboxAPI mApi;
私有字符串mPath;
私有文件输出流MFO;
私有布尔mcanced;
私人长姆费伦;
私有字符串merrormg;
受保护字符串[]fnames;
公共DbFileExplorer(上下文、DropboxAPI、,
字符串dropboxPath,字符串[]efnames){
//我们以这种方式设置上下文,以免意外泄漏活动
mContext=context.getApplicationContext();
fnames=efnames;
mApi=api;
mPath=dropboxPath;
mDialog=新建进度对话框(上下文);
mDialog.setMessage(“打开目录”);
mDialog.show();
}
@凌驾
受保护的布尔doInBackground(Void…params){
//获取目录的元数据
int i=0;
试一试{
fnames=null;
Entry dirent=mApi.metadata(mPath,1000,null,true,null);
ArrayList files=新的ArrayList();
ArrayList dir=新的ArrayList();
for(条目ent:dirent.contents){
//将其添加到我们可以选择的拇指列表中
文件。添加(ent);
add(新字符串(files.get(i++).path));
}
i=0;
fnames=dir.toArray(新字符串[dir.size()]);
返回true;
}捕获(DropboxUnlinkedException){
//AuthSession未正确验证或用户未链接。
}捕获(DropboxPartialFileE异常){
//我们取消了手术
mErrorMsg=“下载已取消”;
}捕获(DropboxServerException e){
//服务器端异常。这些是可能发生的情况的示例,
//但我们在这里对他们没有什么特别的处理。
if(e.error==DropboxServerException.\u 304\u未修改){
//不会发生这种情况,因为我们没有传递带有元数据的修订
}否则如果(e.error==DropboxServerException.\u 401\u未经授权){
//未经授权,所以我们应该取消它们的链接。您可能想要
//在这种情况下,自动注销用户。
}否则如果(e.error==DropboxServerException.\u 403\u禁止){
//不允许访问此文件
}else if(e.error==DropboxServerException.\u 404\u未找到){
//未找到路径(或者如果是缩略图,则无法
//拇指钉)
}否则如果(e.error==DropboxServerException.\u 406\u不可接受){
//返回的条目太多
}else if(e.error==DropboxServerException.\u 415\u不支持的\u媒体){
//不能用拇指钉住
}否则如果(e.error==DropboxServerException.\u 507\u存储不足){
//用户超过配额
}否则{
//别的
}
//这将获取Dropbox错误,并将其翻译成用户的语言
mErrorMsg=e.body.userError;
if(mErrorMsg==null){
mErrorMsg=e.body.error;
}
}捕获(DropboxIOE异常){
//经常发生,可能要自动重试。
mErrorMsg=“网络错误。请重试。”;
}捕获(DropboxParse异常){
//可能是由于Dropbox服务器重新启动,应该重试
mErrorMsg=“Dropbox错误。请重试。”;
}捕获(DropBoxexException e){
//未知错误
mErrorMsg=“未知错误。请重试。”;
}
返回false;
}
@凌驾
受保护的void onProgressUpdate(长…进度){
整数百分比=(整数)(100.0*(双倍)进度[0]/mFileLen+0.5);
mDialog.setProgress(百分比);
}
@凌驾
受保护的void onPostExecute(布尔结果){
mDialog.discouse();
}
私有void showtoos(字符串msg){
Toast error=Toast.makeText(mContext、msg、Toast.LENGTH\u LONG);
error.show();
}
}

异步任务模板的第三个参数是任务的结果类型。将其从Boolean更改为ArrayList或类似结构。然后从
doInBackground
方法返回该值。然后,它将被传递到
AsyncTask
onPostExecute
方法,该方法将在UI线程上执行(因此,如果需要,您可以使用数据操纵UI)。

我正在使用execute().get()解决此类问题

范例

来自活动或片段的调用

ArrayList<String> arraylistitem= new jsonparsing(getActivity()).execute().get();

In async task 

public class jsonparsing extends AsyncTask<Void, Void, ArrayList<String>>
{
public jsonparsing(Activity activity)
    {
        this.activity = activity;
        arraylistitem = new ArrayList<String>();        
    }

    protected ArrayList<String> doInBackground(Void... arg0) 
    {
           // Do anything else you need to with the returned list here
         return arraylistitem;
        }
}
ArrayList arraylistitem=newjsonparsing(getActivity()).execute().get();
在异步任务中
公共类jsonparsing扩展了异步任务
{
公共jsonparsing(活动)
{
这个。活动=活动;
arraylistitem=新的ArrayList();
}
受保护的ArrayList doInBackground(无效…arg0)
{
//您还需要对返回的列表执行其他操作吗
返回arraylistitem;
}
}

OnPostExecute方法,这将在后台方法完成后回调,您可以在此方法中声明listview的适配器谢谢,我已将结果类型更改为String[]。但还是被困在这里。。我试图将此结果返回给mainActivity,然后将其用于Dropbox片段选项卡。在哪里设置ArrayAdapter、ListView和循环结果以显示文件名?我要把它们放在onPostExecute中吗?你能给我一个关于t是如何工作的示例代码吗