如何在异步任务类完成后更改textview(在片段中)的值?
问题描述:
我开始在Android的编程,这是我迄今为止最大的项目。请尝试在你的答案非常具体,因为这对我来说是非常新的。 我想要做什么是我的TextView在OneFragment.`如何在异步任务类完成后更改textview(在片段中)的值?
显示天气(说明)的值这里是MainActivity
package com.example.dell.myop;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import com.example.dell.myop.R;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.widget.TextView;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.dell.myop.fragments.OneFragment;
import com.example.dell.myop.fragments.ThreeFragment;
import com.example.dell.myop.fragments.TwoFragment;
public class MainActivity extends AppCompatActivity {
private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;
String description;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DownloadTask task = new DownloadTask();
task.execute("http://api.openweathermap.org/data/2.5/weather?q=hamirpur,india&appid=41352ca35dd1be72cc7d9f47351d1b41");
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
viewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);
tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.addFragment(new OneFragment(), "Today");
adapter.addFragment(new TwoFragment(), "Tomorrow");
adapter.addFragment(new ThreeFragment(), "Day After");
viewPager.setAdapter(adapter);
}
class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
}
DownloadTask
package com.example.dell.myop;
import android.content.Intent;
import android.os.AsyncTask;
import android.util.Log;
import com.example.dell.myop.fragments.OneFragment;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import static android.support.v4.app.ActivityCompat.startActivity;
public class DownloadTask extends AsyncTask<String,Void,String> {
@Override
protected String doInBackground(String... urls) {
String result = "";
URL url;
HttpURLConnection urlConnection= null;
try {
url = new URL(urls[0]);
urlConnection = (HttpURLConnection) url.openConnection();
InputStream in = urlConnection.getInputStream();
InputStreamReader reader = new InputStreamReader(in);
int data = reader.read();
while(data!=-1){
char current = (char)data;
result += current;
data = reader.read();
}
return result;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
try {
JSONObject jObject = new JSONObject(result);
JSONArray jArray = jObject.getJSONArray("weather");
for (int i=0; i < jArray.length(); i++)
{
try {
JSONObject oneObject = jArray.getJSONObject(i);
// Pulling items from the array
String main = oneObject.getString("main");
String description = oneObject.getString("description");
Log.i("main",main);
Log.i("description",description);
} catch (JSONException e) {
// Oops
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
这里是OneFragment
package com.example.dell.myop.fragments;
/**
* Created by Dell on 13-09-2016.
*/
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.dell.myop.DownloadTask;
import com.example.dell.myop.MainActivity;
import com.example.dell.myop.R;
import com.example.dell.myop.R;
public class OneFragment extends Fragment{
public OneFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_one, container, false);
TextView textView = (TextView) view.findViewById(R.id.textView);
textView.setText(description);
return view;
}
}
答
我建议你将下载任务的逻辑移动到哟你的frargment,如果你只会在这个使用它。 这将是很容易的,这样,只得到了描述,并设置:
textView.setText(description); in your fragment,
如果你想使用这个downloadTask您的活动的其他组件,你要实现你的活动有一定回调并使用它们任何片段来更新用户界面。 因此,让您在活动说你声明一些接口
interface OnDownloadTaskFinish {
onFinish(String description);
}
在您的片段用它
onPostExecute(...){
//...some logic here
getFragment..... .onFinish(description);
}
你应该实现这个接口和
void onFinish(String description){
textView.setText(description);
}
答
1)创建一个interface
您的DownloadTask
,其setter
和notification code
作为
private Listener listener;
public void setListener(Listener listener){
this.listener = listener;
}
public interface Listener{
onCompleted(String description);
}
@Override
protected void onPostExecute(String result) {
// Your Current Code
if(listener != null) listener.onCompleted(description);
}
2)实现此接口的OneFragment
public class OneFragment extends Fragment implements DownloadTask.Listener{
private TextView textView;
@Override
onCompleted(String description){
if(description != null && textView !=null)
textView.setDescription(description);
}
// Other code
}
3)创建global reference
到OneFragment
和MainActivity
作为
private OneFragment oneFragment = new OneFragment();
4)adapter.addFragment(oneFragment, "Today");
更换adapter.addFragment(new OneFragment(), "Today");
设置为Listener
为DownloadTask
5)设置监听器作为
DownloadTask task = new DownloadTask();
task.setListener(oneFragment);
task.execute("http://api.openweathermap.org/data/2.5/weather?q=hamirpur,india&appid=41352ca35dd1be72cc7d9f47351d1b41");
6)这将是后viewPager.setAdapter(adapter);
无论下面的答案更好地
execute
DowloadTask
基本上遵循这个答案http://stackoverflow.com/questions/12575068/how -to-GET-了对结果的-onpostexecute到主活动 - 因为-的AsyncTask-is-a的 –