从列表视图的自定义适配器内的意图服务接收结果
Posted
技术标签:
【中文标题】从列表视图的自定义适配器内的意图服务接收结果【英文标题】:receiving result from intent service inside custom adapter for listview 【发布时间】:2017-01-09 20:00:56 【问题描述】:我想要做的是以下
-
我的自定义适配器布局中有一个按钮,可以与服务器上的 php 脚本交互以在服务器上下载文件
下载过程通过在后台调用
IntentService
来处理
服务完成后,我想更新在活动中启动的列表视图
我被Receiver
类卡住了
到目前为止我的代码如下:
@Override
public View getView(int position, View convertView, ViewGroup parent)
View view = convertView;
if (view == null)
LayoutInflater vi;
vi = LayoutInflater.from(getContext());
if(IsRepository)
view = vi.inflate(R.layout.filerepositorylayout, null);
BindLayoutElemnts(view, position);
return view;
这里是调用 Intent 服务的地方:
private void BindLayoutElemnts(View view, int position)
myFiles = (files) getItem(position);
img_Download.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Intent intent = new Intent(getContext(),DownloadService.class);
intent.putExtra("FileID",""+myFiles.getID());
intent.putExtra("FileName",myFiles.getName());
context.startService(intent);
);
调用活动
这里是 Receiver
被调用的地方
public class user_repositry extends AppCompatActivity implements DownloadReceiver.Receiver
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
myDownloadReceiver = new DownloadReceiver(new Handler());
myDownloadReceiver.setReceiver(this);
@Override
public void onReceiveResult(int resultCode, Bundle resultData)
Toast.makeText(user_repositry.this, "Downloaded", Toast.LENGTH_SHORT).show();
Intent service
代码:
ResultReceiver rec;
@Override
protected void onHandleIntent(Intent intent)
rec = intent.getParcelableExtra("DownloadReceiver");
private void UpdateDBRecord()
HashMap<String, String> PostData=new HashMap<String, String>();
PostData.put("call","UpdateFile");
PostData.put("ID", ""+file_ID);
BackgroundWorker registerWorker= new BackgroundWorker(this,this,PostData);
registerWorker.setShowLoadingMessage(false);
registerWorker.execute(Helper.getPhpHelperUrl());
这个函数就是上面registerWorker
中Post execute
调用的函数
@Override
public void processFinish(String results)
Log.d("Download","Download DB updated");
Bundle bundle = new Bundle();
//bundle.putString("resultValue", "My Result Value. Passed in: " );
// Here we call send passing a resultCode and the bundle of extras
rec.send(Activity.RESULT_OK, bundle);
我现在被这个错误困住了:
Failed resolution of: Lcom/bassem/donateme/classes/DownloadReceiver;
我知道接收器没有被启动,但我似乎无法在我的逻辑中找到丢失的代码
感谢您的帮助
【问题讨论】:
请提供DownloadReceiver
的完整代码以及错误的全文。如果您检查Java Code Convention 并按照此约定修复您的代码,以便人们可以轻松阅读您的代码,这也将非常有帮助。
“解析失败”本身并不是错误消息,这可能是 NoClassDefFoundError,并且完整的错误消息包含更多信息,例如发生错误的行号。您的所有课程都属于同一个项目吗?
【参考方案1】:
试试这个,
第 1 步: 在 Activity 中使用 ResultReceiver 创建结果处理程序
public ResultReceiver downloadReceiver = new ResultReceiver(new Handler())
@Override
protected void onReceiveResult(int resultCode, Bundle resultData)
super.onReceiveResult(resultCode, resultData);
//Broadcast /send the result code in intent service based on your logic(success/error) handle with switch
switch (resultCode)
case 1:
//Get the resultData and do your logic here
//Update your list view item here
break;
case 2:
//Get the resultData and do your logic here
//Update your list view item here
break;
;
第 2 步:将结果处理程序放入 Intent 中并启动 Intent 服务
Intent intent = new Intent(getContext(), DownloadService.class);
intent.putExtra("receiver",downloadReceiver);
第 3 步:在服务类中处理意图(获取结果处理程序的值)
final ResultReceiver receiver;
@Override
protected void onHandleIntent(Intent intent)
receiver = intent.getParcelableExtra("receiver");
第 4 步:将数据发送/广播到结果处理程序
//based on your logic, change the result code and data
//Add your result data (success scenario)
Bundle bundle = new Bundle();
bundle.putString("result","Some text");
receiver.send(1,bundle);
//Add your result data (failure scenario)
receiver.send(0,bundle);
【讨论】:
【参考方案2】:缺少的代码不在您的逻辑中,而是在 DownloadReciever 的逻辑中。更广泛地寻找错误并找出为什么没有加载。那或从中发布一些代码以便可以回答。例如,是否正在寻找一个不存在并因此崩溃的 uri?它期待什么,失败了,为什么失败了。您没有发布任何崩溃的代码。您发布了调用崩溃的代码。
【讨论】:
以上是关于从列表视图的自定义适配器内的意图服务接收结果的主要内容,如果未能解决你的问题,请参考以下文章
使用适用于 Android 应用的自定义适配器将项目动态添加到列表视图
如何使用自定义列表视图在edittext过滤器中获取空间?可以使用简单的适配器吗?