Android 如何将数组列表从AsyncTask返回到主活动中?
我正在尝试在我的应用程序中显示dropbox帐户中的文件列表。我的问题是,如何将列表(fnames)返回到MainActivity中,以便在listview中显示它。 我在主要活动中如何称呼它? android开发新手,欢迎提供任何其他提示 谢谢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
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是如何工作的示例代码吗