Android 片段中的异步任务存在问题
我正在尝试将代码转换为使用片段。我对Android非常陌生,一开始我制作了很多类,只是使用意图从一个活动切换到另一个活动。我正在使用我的一个类,该类从服务器读取JSON数组,并将表表示为列表,并尝试将其转换为片段。为此,我遵循了此处提供的教程: 这意味着我应该将onCreate更改为onStart并包含onCreateView,我已经完成了这项工作。我还将出现的“ClassName.this”更改为“getActivity()”。在尝试将代码转换为片段之前,代码运行良好,但现在我在尝试使用片段时遇到了问题。我认为这与任务有关 在下面的代码块中,jParser是我创建的JSONParser类的一个实例,它处理JSON数据的解析。我还进行了检查,以确保传递给该方法的URL返回要解析的有效JSON。这个类和我上面调用的方法作为一个活动运行良好;当我在一个片段中操作时,有没有理由不能简单地做同样的事情Android 片段中的异步任务存在问题,android,android-fragments,android-activity,actionbarsherlock,Android,Android Fragments,Android Activity,Actionbarsherlock,我正在尝试将代码转换为使用片段。我对Android非常陌生,一开始我制作了很多类,只是使用意图从一个活动切换到另一个活动。我正在使用我的一个类,该类从服务器读取JSON数组,并将表表示为列表,并尝试将其转换为片段。为此,我遵循了此处提供的教程: 这意味着我应该将onCreate更改为onStart并包含onCreateView,我已经完成了这项工作。我还将出现的“ClassName.this”更改为“getActivity()”。在尝试将代码转换为片段之前,代码运行良好,但现在我在尝试使用片段
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.read_options, container, false);
return view;
}
@Override
public void onStart() {
super.onStart();
// TODO Auto-generated method stub
optionsList = new ArrayList<HashMap<String, String>>();
new LoadOptions().execute();
ListView lv = getListView();
...
(Code to launch new activity when an item in list is pressed)
...
}
class LoadOptions extends AsyncTask<String, String, String>{
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(getActivity());
pDialog.setMessage("Loading options. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}
protected String doInBackground(String... args){
List<NameValuePair> params = new ArrayList<NameValuePair>();
JSONObject json = jParser.makeHttpRequest(url_options, "GET", params);
Log.d("All Options: ", json.toString());
try{
int success = json.getInt(TAG_SUCCESS);
if (success == 1){
// Options Found, Iterate Through
options = json.getJSONArray(TAG_OPTIONS);
for(int i = 0; i < options.length(); i++){
JSONObject c = options.getJSONObject(i);
String id = c.getString(TAG_OPTIONID);
String duration = c.getString(TAG_DURATION);
String reward = c.getString(TAG_REWARD);
HashMap<String, String> map = new HashMap<String, String>();
map.put(TAG_OPTIONID, id);
map.put(TAG_DURATION, duration);
map.put(TAG_REWARD, reward);
optionsList.add(map);
}
} else {
// Options are not available or server is down.
// Dismiss the loading dialog and display an alert onPostExecute
pDialog.dismiss();
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String file_url){
pDialog.dismiss();
getActivity().runOnUiThread(new Runnable() {
public void run() {
ListAdapter adapter = new SimpleAdapter(
getActivity(), optionsList, R.layout.list_options, new String[]
{TAG_OPTIONID, TAG_DURATION, TAG_REWARD},
new int[] {R.id.tvOption, R.id.tvDuration, R.id.tvReward});
setListAdapter(adapter);
// Check for whether or not there are options available and display alert
List<NameValuePair> params = new ArrayList<NameValuePair>();
JSONObject json = jParser.makeHttpRequest(url_options, "GET", params);
int success = 0;
try {
success = json.getInt(TAG_SUCCESS);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (success == 0){
AlertDialog.Builder alertDialog = new AlertDialog.Builder(getActivity());
alertDialog.setTitle("No Options Available!");
alertDialog.setMessage("No options currently available. You will receive a " +
"notification when there are options available. Click 'Okay' to return to main screen");
alertDialog.setCancelable(false);
alertDialog.setPositiveButton("Okay", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int id){
Intent i = new Intent(getActivity().getApplicationContext(), MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
}
});
alertDialog.show();
}
}
});
}
@覆盖
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//TODO自动生成的方法存根
视图=充气机。充气(R.layout.read_选项,容器,false);
返回视图;
}
@凌驾
public void onStart(){
super.onStart();
//TODO自动生成的方法存根
optionsList=newarraylist();
新的LoadOptions().execute();
ListView lv=getListView();
...
(按下列表中的项目时启动新活动的代码)
...
}
类LoadOptions扩展了异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
pDialog=newprogressdialog(getActivity());
setMessage(“正在加载选项。请稍候…”);
pDialog.setUndeterminate(假);
pDialog.setCancelable(假);
pDialog.show();
}
受保护的字符串doInBackground(字符串…args){
List params=new ArrayList();
JSONObject json=jParser.makeHttpRequest(url_选项,“GET”,参数);
Log.d(“所有选项:,json.toString());
试一试{
int success=json.getInt(TAG_success);
如果(成功==1){
//已找到选项,请遍历
options=json.getJSONArray(TAG_options);
对于(int i=0;i
错误日志如下所示:
03-03 23:30:50.812: W/System.err(28019): java.net.SocketException: Permission denied
03-03 23:30:50.863: W/System.err(28019): at org.apache.harmony.luni.platform.OSNetworkSystem.socket(Native Method)
03-03 23:30:50.863: W/System.err(28019): at dalvik.system.BlockGuard$WrappedNetworkSystem.socket(BlockGuard.java:335)
03-03 23:30:50.863: W/System.err(28019): at org.apache.harmony.luni.net.PlainSocketImpl.create(PlainSocketImpl.java:216)
03-03 23:30:50.863: W/System.err(28019): at java.net.Socket.checkOpenAndCreate(Socket.java:821)
03-03 23:30:50.863: W/System.err(28019): at java.net.Socket.connect(Socket.java:967)
03-03 23:30:50.863: W/System.err(28019): at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
03-03 23:30:50.863: W/System.err(28019): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:156)
03-03 23:30:50.863: W/System.err(28019): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
03-03 23:30:50.867: W/System.err(28019): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
03-03 23:30:50.867: W/System.err(28019): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:359)
03-03 23:30:50.867: W/System.err(28019): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
03-03 23:30:50.867: W/System.err(28019): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
03-03 23:30:50.867: W/System.err(28019): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
03-03 23:30:50.867: W/System.err(28019): at com.example.abtest.JSONParser.makeHttpRequest(JSONParser.java:62)
03-03 23:30:50.867: W/System.err(28019): at com.example.abtest.ReadOptionsFragment$LoadOptions.doInBackground(ReadOptionsFragment.java:111)
03-03 23:30:50.867: W/System.err(28019): at com.example.abtest.ReadOptionsFragment$LoadOptions.doInBackground(ReadOptionsFragment.java:1)
03-03 23:30:50.867: W/System.err(28019): at android.os.AsyncTask$2.call(AsyncTask.java:185)
03-03 23:30:50.867: W/System.err(28019): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
03-03 23:30:50.867: W/System.err(28019): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
03-03 23:30:50.871: W/System.err(28019): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
03-03 23:30:50.871: W/System.err(28019): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
03-03 23:30:50.871: W/System.err(28019): at java.lang.Thread.run(Thread.java:1019)
03-03 23:30:50.871: E/Buffer Error(28019): Error converting result java.lang.NullPointerException
03-03 23:30:50.871: E/JSON Parser(28019): Error parsing data org.json.JSONException: End of input at character 0 of
03-03 23:30:50.882: W/dalvikvm(28019): threadid=10: thread exiting with uncaught exception (group=0x4001e578)
03-03 23:30:50.882: E/AndroidRuntime(28019): FATAL EXCEPTION: AsyncTask #1
03-03 23:30:50.882: E/AndroidRuntime(28019): java.lang.RuntimeException: An error occured while executing doInBackground()
03-03 23:30:50.882: E/AndroidRuntime(28019): at android.os.AsyncTask$3.done(AsyncTask.java:200)
03-03 23:30:50.882: E/AndroidRuntime(28019): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
03-03 23:30:50.882: E/AndroidRuntime(28019): at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
03-03 23:30:50.882: E/AndroidRuntime(28019): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
03-03 23:30:50.882: E/AndroidRuntime(28019): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
03-03 23:30:50.882: E/AndroidRuntime(28019): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
03-03 23:30:50.882: E/AndroidRuntime(28019): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
03-03 23:30:50.882: E/AndroidRuntime(28019): at java.lang.Thread.run(Thread.java:1019)
03-03 23:30:50.882: E/AndroidRuntime(28019): Caused by: java.lang.NullPointerException
03-03 23:30:50.882: E/AndroidRuntime(28019): at com.example.abtest.ReadOptionsFragment$LoadOptions.doInBackground(ReadOptionsFragment.java:112)
03-03 23:30:50.882: E/AndroidRuntime(28019): at com.example.abtest.ReadOptionsFragment$LoadOptions.doInBackground(ReadOptionsFragment.java:1)
03-03 23:30:50.882: E/AndroidRuntime(28019): at android.os.AsyncTask$2.call(AsyncTask.java:185)
03-03 23:30:50.882: E/AndroidRuntime(28019): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
03-03 23:30:50.882: E/AndroidRuntime(28019): ... 4 more
03-03 23:30:56.742: E/WindowManager(28019): Activity com.example.abtest.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@4055c690 that was originally added here
03-03 23:30:56.742: E/WindowManager(28019): android.view.WindowLeaked: Activity com.example.abtest.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@4055c690 that was originally added here
03-03 23:30:56.742: E/WindowManager(28019): at android.view.ViewRoot.<init>(ViewRoot.java:263)
03-03 23:30:56.742: E/WindowManager(28019): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:171)
03-03 23:30:56.742: E/WindowManager(28019): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:114)
03-03 23:30:56.742: E/WindowManager(28019): at android.view.Window$LocalWindowManager.addView(Window.java:424)
03-03 23:30:56.742: E/WindowManager(28019): at android.app.Dialog.show(Dialog.java:242)
03-03 23:30:56.742: E/WindowManager(28019): at com.example.abtest.ReadOptionsFragment$LoadOptions.onPreExecute(ReadOptionsFragment.java:104)
03-03 23:30:56.742: E/WindowManager(28019): at android.os.AsyncTask.execute(AsyncTask.java:391)
03-03 23:30:56.742: E/WindowManager(28019): at com.example.abtest.ReadOptionsFragment.onStart(ReadOptionsFragment.java:62)
03-03 23:30:56.742: E/WindowManager(28019): at android.support.v4.app.Fragment.performStart(Fragment.java:1332)
03-03 23:30:56.742: E/WindowManager(28019): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:906)
03-03 23:30:56.742: E/WindowManager(28019): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
03-03 23:30:56.742: E/WindowManager(28019): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
03-03 23:30:56.742: E/WindowManager(28019): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
03-03 23:30:56.742: E/WindowManager(28019): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:420)
03-03 23:30:56.742: E/WindowManager(28019): at android.os.Handler.handleCallback(Handler.java:587)
03-03 23:30:56.742: E/WindowManager(28019): at android.os.Handler.dispatchMessage(Handler.java:92)
03-03 23:30:56.742: E/WindowManager(28019): at android.os.Looper.loop(Looper.java:130)
03-03 23:30:56.742: E/WindowManager(28019): at android.app.ActivityThread.main(ActivityThread.java:3687)
03-03 23:30:56.742: E/WindowManager(28019): at java.lang.reflect.Method.invokeNative(Native Method)
03-03 23:30:56.742: E/WindowManager(28019): at java.lang.reflect.Method.invoke(Method.java:507)
03-03 23:30:56.742: E/WindowManager(28019): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
03-03 23:30:56.742: E/WindowManager(28019): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
03-03 23:30:56.742: E/WindowManager(28019): at dalvik.system.NativeStart.main(Native Method)
03-03 23:30:50.812:W/System.err(28019):java.net.SocketException:权限被拒绝
03-03 23:30:50.863:W/System.err(28019):位于org.apache.harmony.luni.platform.OSNetworkSystem.socket(本机方法)
03-03 23:30:50.863:W/System.err(28019):位于dalvik.System.BlockGuard$WrappedNetworkSystem.socket(BlockGuard.java:335)
03-03 23:30:50.863:W/System.err(28019):位于org.apache.harmony.luni.net.PlainSocketImpl.create(PlainSocketImpl.java:216)
03-03 23:30:50.863:W/System.err(28019):位于java.net.Socket.checkOpenAndCreate(Socket.java:821)
03-03 23:30:50.863:W/系统错误(28019)
<uses-permission android:name="android.permission.INTERNET"/>