0

如何从类#B 调用类#A 中定义的函数?Class#B 扩展了 AsynchTask 并从 Web 服务获取远程数据。我试图从 class#B 调用的 class#A 函数用于发送检索到的远程数据以供 Class#A 显示。

我正在尝试将 class#A 的当前实例传递给 class#B 使用this,但这只是传递上下文,因此无法识别函数。

我也尝试过使用static,但是当函数运行一个新线程时,将函数定义为静态会产生编译器错误。

我试图调用的代码如下:

public void test(List<DATA> Data){
        this.Data = Data;
        runOnUiThread(new Runnable() {          

            @Override
            public void run() {
                // TODO Auto-generated method stub
                for(DATA data : MainActivity.this.Data){
                    Toast.makeText(MainActivity.this, data.title, Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
4

4 回答 4

0
From your question, I understood that u want to show the result of asynctask in another class. You can use onProressUpdate api of asynctask. You can do the work in doInBackground and then call publishProgress(value) whihc in turn calls onProgressUpdate and run on UI thred.

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

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

另一种方式:

您可以在 class#A 中定义一个处理程序并从 class#B 调用它

Sorry if i mis understood your question.
于 2013-08-16T14:23:08.433 回答
0

据我了解,您从 A 和 AsyncTask B 开始,因为 Web 获取仅在 Android 中以异步方式工作。您希望 A 中的对象可以访问 fetch 的结果。

A 会编写这样的代码。

public class A extends FragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        TextView fetch = (TextView) findViewById(R.id.fetch);
        new B(getApplicationContext(),fetch).execute();
        // This will update a TextView when fetching is done.
    }
}

public class B extends AsyncTask<Void, Integer, Void> {
    Context c;
    TextView f;
    public B(Context c, TextView f) {
        super();
        this.f = f;
        this.c = c;
    }


    @Override
    protected Void doInBackground(Void... params) {
        // TODO: the fetching: fetch()
        String t = fetch();
        f.setText();
        return null;
    }
}

您可以使用 pre 和 post 执行方法来做其他技巧。我希望我能帮上忙!

于 2013-08-16T14:29:54.880 回答
0

您可以制作一个界面,即:

public interface RecieveDataDelegate {

    public void receiveData(Object dataFromWebService, boolean success);
}

让 Class#A 实现接口。当从 Class#A 调用 asyncTask 时,将自身传递给具有 ReceiveDataDelegate 类型参数的 AsyncTask 的构造函数。

new AsyncTask1 (this).execute();

并使用构造函数设置 AsyncTask 并将数据发送回 Class#A onPostExecute() 以便您可以更新 ui。

 class AsyncTask1 extends AsyncTask<Void, Void, Boolean> {
    Object dataReceived ;
    protected RecieveDataDelegate delegate;

    public AsyncTask1 (RecieveDataDelegate delegate) {
        this.delegate = delegate;
    }
    protected Boolean doInBackground(Void... params) {
      //do your service request and set dataRecieved
    }
    protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);
        delegate.RecieveDataDelegate (dataReceived, result.booleanValue());
    }

这样,任何实现该接口的类都可以使用相同的 asyncTask。

于 2013-08-16T14:35:21.050 回答
0

你会这样做:

在 MainActivity 中:

ClassBAsyncTask mat = new ClassBAsyncTask(this, .., ..);

ClassBAsyncTask 的构造函数:

public ClassBAsyncTask(MainActivity context, .., ..) {
    mContext = context;
    ....
    ....
}

test(List<DATA>)从内部调用 MainActivity 的方法ClassBAsyncTask

((MainActivity)mContext).test(yourListVariable);

查看弱引用以确保在活动不再存在时AsyncTask不使用。mContext

于 2013-08-16T14:37:56.823 回答