2012-09-16 66 views
0

我无法从单独的类中的asynctask中将数据返回到我的主要活动中。将数据从AsyncTask返回到活动

这是我的主要活动:

public class Main extends Activity { 
EditText searchOne; 
EditText searchTwo; 

Button findMovies; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.totlayout); 

    //set the UI elements 
    searchOne = (EditText) findViewById(R.id.searchOne); 
    searchTwo = (EditText) findViewById(R.id.searchTwo); 

    findMovies = (Button) findViewById(R.id.findMovies); 


} 
public void displayResults(View view){ 
    //do something in response to button 
    Intent intent = new Intent(this, DisplayResultsActivity.class); 

    //make person search url1 
    final StringBuilder personSearchURLOne = new StringBuilder(getName.getName1(searchOne)); 
    final String searchURLOne = personSearchURLOne.toString(); 
    Log.d("searchurlone", searchURLOne.toString()); 

    //make person search url2 
    final StringBuilder personSearchURLTwo = new StringBuilder(getName.getName2(searchTwo)); 
    final String searchURLTwo = personSearchURLTwo.toString(); 

    //get ID 1 this needs to get data back from asynctask in the type string to be passed to buildCreditURL 
    new getFirstID().execute(searchURLOne); 

    //get ID 2 
    new getFirstID().execute(searchURLTwo); 

    //make credit search url1 
    final StringBuilder creditURLOne = new StringBuilder(buildCreditURL.getCreditURLOne(firstID)); 

下面是一个包含我的AsyncTask我单独的类文件:

package com.tot.tipofthetongue; 

import android.os.AsyncTask; 

import android.util.Log; 





import org.json.JSONArray; 
import org.json.JSONException; 

import org.json.JSONObject; 

public class getFirstID extends AsyncTask<String, Void, String> { 

public static String TAG_ID = "id"; 
public static String TAG_RESULTS = "results"; 


String personOne = null; 
static String firstID = null; 


@Override 
protected String doInBackground(String... personSearchURLOne) { 
    Log.d("personSearchURLOne in getFirstID containts", personSearchURLOne[0]); 

    JSONArray results = null; 

    JSONParser jParser = new JSONParser(); 

    JSONObject jSon = jParser.doInBackground(personSearchURLOne[0]); 

    try{ 
     results = jSon.getJSONArray(TAG_RESULTS); 

     for(int i = 0; i < results.length(); i++){ 
      JSONObject r = results.getJSONObject(i); 
      firstID = r.getString(TAG_ID); 

     } 


    } 
    catch(JSONException e){ 
     Log.e("Error", e.toString()); 
    } 
      /need this value as string to be passed back to the main activity 
    return firstID; 


} 




} 

如何firstID作为一个字符串到我的主要活动,也可以是在属于另一个单独的类文件的另一个方法中使用。

修订getFirstID:

package com.tot.tipofthetongue; 


import android.os.AsyncTask; 

import android.util.Log; 





import org.json.JSONArray; 
import org.json.JSONException; 

import org.json.JSONObject; 

public class getFirstID extends AsyncTask<String, Void, String> { 

public static String TAG_ID = "id"; 
public static String TAG_RESULTS = "results"; 


String personOne = null; 
static String firstID = null; 


@Override 
protected String doInBackground(String... personSearchURLOne) { 

    Log.d("personSearchURLOne in getFirstID containts", personSearchURLOne[0]); 

    JSONArray results = null; 

    JSONParser jParser = new JSONParser(); 

    JSONObject jSon = jParser.doInBackground(personSearchURLOne[0]); 

    try{ 
     results = jSon.getJSONArray(TAG_RESULTS); 

     for(int i = 0; i < results.length(); i++){ 
      JSONObject r = results.getJSONObject(i); 
      firstID = r.getString(TAG_ID); 

     } 


    } 
    catch(JSONException e){ 
     Log.e("Error", e.toString()); 
    } 
    return firstID; 


} 
@Override 
public void onPostExecute(String firstID){ 

} 




} 

回答

1

您可以通过使用意图送东西到另一个活动。

Intent intent = new Intent(this, YourActivity.class); 
intent.putExtra("name", string); 

读到它here

或者你可以把你的AsyncTask类的活动类中。

public class Main extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.get_data); 


} 

private class Download extends AsyncTask <Void, Void, String> { 

    protected String doInBackground(Void...params) { 

    } 

    @Override 
    protected void onPostExecute(String result) { 

    } 

    @Override 
    protected void onPreExecute() { 

    } 

} 

} 
+0

所以在我的getFirstID类中添加时:Inent intent = new Intent(this,Main.class);在doInBackground下我得到一个构造函数未定义的错误。 – user881667

2

覆盖在getFirstID类中的方法onPostExecute(String result)

@Override protected void onPostExecute(String result) { 
    // Invoke method on Main activity or do other action. 
} 

此方法由UI线程执行,并且可以更新视图。您可以通过在构造函数中将其设置在getFirstID类的字段中来添加对MainActivity的引用。

希望它有帮助!

+0

我在更新中添加了@Override,但我不确定如何在主线程上调用它并获取我的值。我对此很新。你能详细说明吗? – user881667

2

一个非常简单的方法就是做到这一点。

public class getFirstID extends AsyncTask<String, Void, Pair<String, String>> { 
    public static interface MyAsyncCallback { 
     /** 
     * Called when the AsyncTask is finished processing the url. 
     * @param url the url that the firstId was from 
     * @param firstId the id that was parsed out of the json object 
     */ 
     public void setFirstId(String url, String firstId); 
    } 

    private final MyAsyncCallback mCallback; 

    public getFirstID(MyAsyncCallback callback) { 
     mCallback = callback; 
    } 

    public Pair<String,String> doInBackground(String... params) { 
     String firstID = parseJsonForID(params); // I am not going to copy your alg into here. 
     return Pair.create(params[0], firstId); 
    } 


    public void onPostExecute(Pair<String,String> urlAndFirstId) { 
    mCallback.setFirstId(urlAndFirstId.first, urlAndFirstId.second); 
    } 
} 

public class Main extends Activity implements MyAsyncCallback { 
    .... 

public void setFirstId(String url, String firstID) { 
     // Example 
     Intent intent = new Intent(this, OtherActivity.class); 
     intent.putExtra("firstId", firstId); 
     intent.putExtra("url", url); 
     startActivity(intent); 
} 
} 
+0

在活动中,一旦启动了AsyncTask,您如何知道AsyncTask何时完成并且FirstID在编码时是否正确设置?问题在于,无法预测FirstID何时准备就绪,因为它正在运行单独的线程并在应用程序运行时确定。而不使用一些等待机制,例如AsyncTask.get();回调实现没有意义。 – yorkw

+0

不,回调没有意义。在回调中传递的字符串是值。它已准备好被使用。所以第一个ID是找到的字符串。在setFirstId(String firstId)的回调方法中处理所有内容;当你拥有这个id并且这个任务肯定完成后,你会做什么。没有等待。 –

+0

我更新了代码,以便回调现在管理URI的firstId配对。所以当回调事件发生时,您知道该ID来自给定的url。 –