我创建了一个从mysql服务器获取数据的应用程序。只要我需要使用AsyncTask很多次。我创建了一个包含AsyncTask的类,然后,我使用getter方法从我的AsyncTask类中获取结果。 所以,首先,我创建了AsyncTask如下:
public class Get_Contacts_Details extends AsyncTask<Void, Void, Boolean>
{
public String[] Names;
public String[] TheNames ;
private JSONParser jsonParser = new JSONParser();
private Context mContext ;
private JSONObject jsonObjectResult = null;
private String Contact_id ;
private String error;
private String THE_URL ;
public Get_Contacts_Details(String Contact_id, String THE_URL, Context mContext)
{
super();
this.Contact_id = Contact_id ;
this.THE_URL = THE_URL ;
this.mContext = mContext ;
}
@Override
protected void onPreExecute()
{
super.onPreExecute();
}
@Override
protected Boolean doInBackground(Void... params)
{
List<NameValuePair> pairs = new ArrayList<NameValuePair>();
pairs.add(new BasicNameValuePair("Contact_id","'"+Contact_id+"'"));
jsonObjectResult = jsonParser.makeHttpRequest(THE_URL, pairs);
if (jsonObjectResult == null)
{
error = "Error in the connection";
return false;
}
try
{
if (jsonObjectResult.getInt("success") == 1)
{
JSONArray jsonArray = jsonObjectResult.getJSONArray("posts");
JSONObject news ;
TheNames = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length(); i++)
{
news = jsonArray.getJSONObject(i);
Contacts_ListView listviewcontact = new Contacts_ListView
(
news.getString("Names")
);
TheNames[i] = listviewcontact.getContactName();
}
return true;
}
else
error = jsonObjectResult.getString("message");
}
catch (Exception ex)
{
}
return false;
}
@Override
protected void onPostExecute(Boolean aBoolean)
{
super.onPostExecute(aBoolean);
if (!aBoolean)
Toast.makeText(getmContext(), error, Toast.LENGTH_LONG).show();
else
setNames(TheNames);
}
public String[] getNames() {
return Names;
}
public void setNames(String[] names) {
Names = names;
}
public Context getmContext() {
return mContext;
}
}
然后我从另一个班级调用它如下:
public class FilesListActivity extends AppCompatActivity {
private RadioGroup ll ;
private String[] filename;
private String mURL = "Myweb.php";
private String TheNames = "";
private MyFunctionsClass myFunctionsClass;
private Get_Contacts_Details get_contacts_details ;
@Override
public String getText()
{
String[] my ;
myFunctionsClass = new MyFunctionsClass();
int id_Btn = ll.getCheckedRadioButtonId() ;
selectedRB = (RadioButton) findViewById(id_Btn) ;
mfile_data = "THE DATA "
get_contacts_details = new Get_Contacts_Details(
mfile_data,mURL,FilesListActivity.this);
get_contacts_details.execute();
\\ my is always NULL.
my = get_contacts_details.getNames();
for(int i = 0 ; i> my.length;i++)
{
TheNames+=my[i]+"\n";
}
return TheNames ;
}
字符串数组my始终为Null。我怎么解决这个问题?
答案 0 :(得分:1)
Asynctask不能以这种方式工作。 您应该在onPostExecute
之后更新您的UI /逻辑@Override
protected void onPostExecute(Boolean aBoolean)
{
super.onPostExecute(aBoolean);
if (!aBoolean)
Toast.makeText(getmContext(), error, Toast.LENGTH_LONG).show();
else
setNames(TheNames);
//HERE
String names = "";
for(int i = 0 ; i> TheNames.length;i++)
{
names+=TheNames[i]+"\n";
}
}
如果您希望将数据返回到您的活动,请使用界面, 请参阅有关AsyncTask的文档: https://developer.android.com/reference/android/os/AsyncTask.html
更新
使用以下代码
创建此接口类:
public interface DataListener {
void onDataListener (String[] data);
}
修改你的Asynctask类
public class Get_Contacts_Details extends AsyncTask<Void, Void, Boolean>
{
public String[] Names;
public String[] TheNames ;
private JSONParser jsonParser = new JSONParser();
private Context mContext ;
private JSONObject jsonObjectResult = null;
private String Contact_id ;
private String error;
private String THE_URL ;
private DataListener mListener;
public Get_Contacts_Details(String Contact_id, String THE_URL, Context mContext, DataListener mListener)
{
super();
this.Contact_id = Contact_id ;
this.THE_URL = THE_URL ;
this.mContext = mContext ;
this.mListener = mListener;
}
@Override
protected void onPreExecute()
{
super.onPreExecute();
}
@Override
protected Boolean doInBackground(Void... params)
{
List<NameValuePair> pairs = new ArrayList<NameValuePair>();
pairs.add(new BasicNameValuePair("Contact_id","'"+Contact_id+"'"));
jsonObjectResult = jsonParser.makeHttpRequest(THE_URL, pairs);
if (jsonObjectResult == null)
{
error = "Error in the connection";
return false;
}
try
{
if (jsonObjectResult.getInt("success") == 1)
{
JSONArray jsonArray = jsonObjectResult.getJSONArray("posts");
JSONObject news ;
TheNames = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length(); i++)
{
news = jsonArray.getJSONObject(i);
Contacts_ListView listviewcontact = new Contacts_ListView
(
news.getString("Names")
);
TheNames[i] = listviewcontact.getContactName();
}
return true;
}
else
error = jsonObjectResult.getString("message");
}
catch (Exception ex)
{
}
return false;
}
@Override
protected void onPostExecute(Boolean aBoolean)
{
super.onPostExecute(aBoolean);
if (!aBoolean)
Toast.makeText(getmContext(), error, Toast.LENGTH_LONG).show();
else
setNames(TheNames);
if (mListener != null){
mListener.onDataListener(TheNames);
}
}
public String[] getNames() {
return Names;
}
public void setNames(String[] names) {
Names = names;
}
public Context getmContext() {
return mContext;
}
}
修改您的活动类
public class FilesListActivity extends AppCompatActivity {
private RadioGroup ll ;
private String[] filename;
private String mURL = "Myweb.php";
private String TheNames = "";
private MyFunctionsClass myFunctionsClass;
private Get_Contacts_Details get_contacts_details ;
@Override
public String getText()
{
String[] my ;
myFunctionsClass = new MyFunctionsClass();
int id_Btn = ll.getCheckedRadioButtonId() ;
selectedRB = (RadioButton) findViewById(id_Btn) ;
mfile_data = "THE DATA "
get_contacts_details = new Get_Contacts_Details(
mfile_data,mURL,FilesListActivity.this, listener);
get_contacts_details.execute();
//you can't return TheNames value here
return TheNames ;
}
public DataListener listener = new DataListener() {
@Override
public void onDataListener (String[] data) {
for(int i = 0 ; i> data.length;i++)
{
TheNames+=data[i]+"\n";
}
//now your have the data here, use in your activity, update your UI, etc.
}
}
}
请记住AsyncTask用于异步任务,不要期望在getText()方法中返回你的数据,btw是谁调用getText()方法?